Я написал большую программу с вложенными классами/потоками и несколькими модулями. Теперь я хотел бы добавить простой графический интерфейс и несколько меток для отображения некоторых переменных. Однако переменные разбросаны по модулям и классам. Я ищу способ обновить эти переменные в графическом интерфейсе без слишком большого изменения текущего кода.
У меня есть элементарное понимание Pyqt4 (я также приму ответы tkinter).
Я пытался не использовать сигналы/эмиты, потому что, насколько мне известно, эмиты должны отправляться из Qthread, что означало бы полную переработку моего кода, замену классов и потоков на Qthreads. Я хотел бы избежать необходимости делать это, если это возможно. Вот один пример, который я пытался.
test.py
class Update(Thread):
def __init__(self):
Thread.__init__(self)
def run(self):
for i in range(10):
time.sleep(2)
import test
wa.label.setText(str(i))
class MyWindow(QWidget):
def __init__(self, *args):
QWidget.__init__(self, *args)
self.label = QLabel(" ")
layout = QVBoxLayout()
layout.addWidget(self.label)
self.setLayout(layout)
Update1 = Update()
Update1.start()
Update1.refresh1 = 'ba'
self.label.setText(Update1.refresh1)
if __name__ == "__main__":
app = QApplication(sys.argv)
wa = MyWindow()
wa.show()
sys.exit(app.exec_())
Этот код работает, но мои переменные должны обновляться из других модулей/классов или потоков. В тот момент, когда я перемещаю «обновление класса» в новый модуль, например ЭТО:
test.py
import test2
class MyWindow(QWidget):
def __init__(self, *args):
QWidget.__init__(self, *args)
self.label = QLabel(" ")
layout = QVBoxLayout()
layout.addWidget(self.label)
self.setLayout(layout)
Update1 = test2.Update()
Update1.start()
Update1.refresh1 = 'ba'
self.label.setText(Update1.refresh1)
if __name__ == "__main__":
app = QApplication(sys.argv)
wa = MyWindow()
wa.show()
sys.exit(app.exec_())
test2.py #updates GUI
class Update(Thread):
def __init__(self):
Thread.__init__(self)
def run(self):
for i in range(10):
time.sleep(2)
import test
test.wa.label.setText(str(i))
Я получаю: AttributeError: 'module' object has no attribute 'wa'
Кроме того, я также рассматривал возможность помещения класса Update() в Qthread, запуская его из любого модуля/класса, где переменная была обновлена, и используя функцию emit внутри Update(). это решило бы необходимость изменить мои текущие классы/потоки на Qthreads.
Если кто-нибудь знает простой способ обновить свой графический интерфейс, просто вызвав такой класс, как update(), пример будет оценен