Я пытаюсь создать приложение PyQt5, в котором я использовал определенные метки для отображения переменных состояния. Чтобы обновить их, я реализовал пользовательские pyqtSignal
вручную. Однако при отладке я обнаружил, что значение GUI QLabel
изменилось, но значения не отражаются в главном окне.
В некоторых ответах предлагалось время от времени звонить QApplication().processEvents()
. Однако это мгновенно приводит к сбою приложения, а также зависает приложение.
Вот пример кода (все необходимые библиотеки импортированы, это только проблема создания части, фактический код огромен):
from multiprocessing import Process
def sub(signal):
i = 0
while (True):
if (i % 5 == 0):
signal.update(i)
class CustomSignal(QObject):
signal = pyqtSignal(int)
def update(value):
self.signal.emit(value)
class MainApp(QWidget):
def __init__(self):
super().__init__()
self.label = QLabel("0");
self.customSignal = CustomSignal()
self.subp = Process(target=sub, args=(customSignal,))
self.subp.start()
self.customSignal.signal.connect(self.updateValue)
def updateValue(self, value):
print("old value", self.label.text())
self.label.setText(str(value))
print("new value", self.label.text())
Вывод операторов print
соответствует ожидаемому. Однако текст в этикетке не меняется.
Функция update
в CustomSignal
вызывается некоторым потоком. Я применил тот же метод для обновления индикатора выполнения, который отлично работает.
Есть ли другое решение для этого, кроме processEvents()
?
ОС - Ubuntu 16.04.