Измените значение объекта pyqt из одного файла Python в другой

#python #object #user-interface #pyqt5 #qprogressbar

Вопрос:

Я вызываю main.ui из main.py, и когда я нажимаю btn_test кнопку, я хочу изменить значение qprogressbar через testfile.py.

Это main.ui:

основной.пользовательский интерфейс.

И это main.py:

 import os
import sys
from PyQt5.QtWidgets import *
from PyQt5 import uic

import testfile

def resource_path(relative_path):
    base_path = getattr(sys, "_MEIPASS", os.path.dirname(os.path.abspath(__file__)))
    return os.path.join(base_path, relative_path)

form = resource_path('main.ui')
form_class = uic.loadUiType(form)[0]

class WindowClass(QMainWindow, form_class):

    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.btn_test.clicked.connect(testfile.fnc_test)

    def set_count(self):
        print('Start')
        self.progress_test.setValue(50)
        print('End')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    myWindow = WindowClass()
    myWindow.show()
    app.exec_()
 

И это testfile.py:

 import main

def fnc_test():
    print('test')
    main.WindowClass().set_count()
 

Я ожидал fnc_test , что функция testfile.py будет выполнена, когда я нажму btn_test .

И я думаю, что когда fnc_test функция выполняется, set_count функция WindowClass of main.py выполняется, и значение qprogress изменяется на 50, вот так:

этот.

Когда я бегу main.py, результат, как показано ниже:

 test
Start
End
 

но индикатор выполнения не изменился.

Комментарии:

1. main.WindowClass() создает новый экземпляр , который будет немедленно собран как мусор. Вам нужно получить ссылку на главное окно, которое вы уже создали. Один из способов сделать это: from PyQt5.QtWidgets import qApp; for widget in qApp.topLevelWidgets(): if isinstance(widget, main.WindowClass): widget.set_count(); break .