【发布时间】:2017-05-10 04:24:02
【问题描述】:
我正在尝试创建一个 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 语句的输出符合预期。但是,标签中的文本不会改变。
CustomSignal 中的update 函数被某个线程调用。
我已经应用了相同的方法来更新进度条,效果很好。
除了processEvents(),还有其他解决方法吗?
操作系统是 Ubuntu 16.04。
【问题讨论】:
-
显示您的代码以帮助您
-
添加了示例代码。
-
请发布完整代码(或至少是完整代码的精简版),否则我们很难仅查看部分代码并帮助您解决问题。
-
感谢您的帮助。问题出在我的实施上。我已经弄清楚了,并且还为我自己的问题添加了答案。欢迎您为其添加更多技术细节。