2016-12-25 83 views
0

我正在尝试创建一个PyQt5应用程序,其中我使用了某些标签来显示状态变量。要更新它们,我已手动实施自定义pyqtSignal。但是,在调试时,我发现GU​​I QLabel的值已更改,但这些值未反映在主窗口上。为什么有些小部件不会在Qt5上更新?

有些答案建议偶尔拨打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。

+0

显示您的代码以帮助您 – eyllanesc

+0

添加示例代码。 –

+0

请发布一个完整的代码(或至少一个完整代码的精简版),否则我们很难复制这个问题,只是看代码的一部分并帮助你。 – Eddie

回答

0

关键问题在于代码背后的概念。

进程拥有自己的地址空间,除非使用某些进程间通信算法,否则不会与其他进程共享数据。也许,multithreading模块被用来代替threading模块来带来并发性,以避免Python的GIL并加速程序。但是,子进程无法访问父进程的数据。

我已经测试了两种解决方案,这种情况下,他们似乎工作。

  • 线程模块:无论线程在Python是由于GIL效率不高,但它仍然足以在一定程度上为基本的并发性的要求。请注意并发和加速之间的区别。

  • 的QThread:由于您使用PyQt的,有没有在使用的QThread,这是一个更好的选择,因为它需要并发到多核利用操作系统的系统调用的任何问题,而不是Python中的中间。

相关问题