【问题标题】:Why does some widgets don't update on Qt5?为什么有些小部件在 Qt5 上没有更新?
【发布时间】: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。

【问题讨论】:

  • 显示您的代码以帮助您
  • 添加了示例代码。
  • 请发布完整代码(或至少是完整代码的精简版),否则我们很难仅查看部分代码并帮助您解决问题。
  • 感谢您的帮助。问题出在我的实施上。我已经弄清楚了,并且还为我自己的问题添加了答案。欢迎您为其添加更多技术细节。

标签: pyqt qt5 pyqt5 qt5.7


【解决方案1】:

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

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

我已经针对这种情况测试了两种解决方案,它们似乎都有效。

  • 线程模块:尽管Python中的线程由于GIL而效率低下,但在一定程度上对于基本的并发需求仍然足够。注意并发和加速之间的区别。

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

【讨论】:

    【解决方案2】:

    尝试添加

    self.label.repaint()
    

    更新文本后立即,如下所示:

    self.label.setText(str(value))
    self.label.repaint()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-05
      • 1970-01-01
      • 1970-01-01
      • 2011-05-17
      • 1970-01-01
      • 2021-06-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多