Pyqt5--为啥 QApplication.processEvents() 更新 GUI 失败

Posted

技术标签:

【中文标题】Pyqt5--为啥 QApplication.processEvents() 更新 GUI 失败【英文标题】:Pyqt5--Why QApplication.processEvents() failed to update GUIPyqt5--为什么 QApplication.processEvents() 更新 GUI 失败 【发布时间】:2019-01-15 10:35:02 【问题描述】:

我正在学习使用 PyQT5 和 QtDesign。工作流程是:单击按钮->更改图像。但是直到 QMessege 出现,GUI 才更新。这是一个代码。首先,我通过 QtDesign 绘制了一个名为 pass_btn 的按钮,一个名为 fds_img 的标签。

然后,代码如下:

from PyQt5 import QtWidgets, uic, QtGui
import os, sys
from PyQt5.QtWidgets import *

app = QtWidgets.QApplication(sys.argv)
dlg = uic.loadUi('grading_sys.ui')

stepper = 0
img_dir_list = [] #this is a image dir list
dlg.fds_img.setPixmap(QtGui.QPixmap(img_dir_list[stepper]))

def pass_btn():
    global stepper
    if stepper == len(img_dir_list) - 1:
         QtWidgets.QMessageBox.information(None, 'Warning', 'Warning')
         return
    stepper += 1
    dlg.fds_img.setPixmap(QtGui.QPixmap(img_dir_list[stepper]))
    print('Try to refresh')
    QApplication.processEvents()

dlg.pass_btn.clicked.connect(pass_btn)

dlg.show()
sys.exit(app.exec_())

那么为什么我不能刷新标签?或者单击按钮时如何刷新图像?

【问题讨论】:

@Isma 非常感谢您的 cmets。我已经发布了所有代码,并添加了一个 .ui 图像。 您好,该图像是不必要的,您需要包含 grading_sys.ui(或它的小版本)中的代码,因为我们无权访问该文件。此外,您的代码无法编译(查看行 globle stepper)。 @Isma 感谢您的建议。只有一个标签和一个按钮。我按行导入它们:dlg = uic.loadUi('grading_sys.ui'),而不是直接转换为 python 代码。那我还需要转换吗? 你当前的代码对我来说没有任何问题,你能分享一下.ui吗?你在哪里执行你的代码?除了没有必要使用processEvents。这是你所有的代码还是你有任何其他代码? @Isma 非常感谢您的测试。这些确实是整个代码。我是pyqt5的新手。我在 MacOS 10.14.2、Pycharm 2018.3.3 中运行了这些代码。另外,我尝试在每一步都打印日志。代码确实运行了,但屏幕在 QMessage 或重新聚焦到主窗口之前永远不会更新。你对此有什么想法吗?这是谷歌驱动器中的 ui 文件:drive.google.com/file/d/1FLiufUzfmwrOqWR9dujr2DEX51mzCub2/… 【参考方案1】:

最后,我使用 QTimer 解决了这个问题。我知道这是对 CPU 的浪费,可能效率不够,但它终于奏效了。但是我仍然对为什么它以前不起作用感到困惑。我用下面的代码解决了这个问题:

首先将所有更新代码放在一个def中,然后用QTimer连接,每秒运行一次:

def refresh_ui():
    print('Try to refresh UI')
    print('Prepare to change image' + str(img_dir_list[stepper]))
    dlg.fds_img.setPixmap(QtGui.QPixmap(img_dir_list[stepper]))

timer = QTimer()
timer.timeout.connect(refresh_ui)
timer.start(1000)

我的环境:MacOS 10.14.2、PyCharm 2018.3.3 edu 版、Python 3.6、PyQt5、QtDesign(通过 Anaconda)。这是因为 MacOS 造成的吗?

【讨论】:

以上是关于Pyqt5--为啥 QApplication.processEvents() 更新 GUI 失败的主要内容,如果未能解决你的问题,请参考以下文章

PyQt5:为啥我只能为 QTableWidget 单元格使用两种颜色?

当我在 PyQt5 窗口中嵌入 Matplotlib 图形时,为啥有两个重复的轴标签?

如果我知道它存在,为啥我 pyqt5 告诉我这个小部件不存在?

为啥我不能在 pyqt5 gui 中嵌入的 matplotlib 颜色图中成功绘制感兴趣区域?

为啥在 PyQt5 中打开新窗口时我的应用程序会关闭?

为啥当我放大Windows尺寸时,pyqt5中笔没有在鼠标坐标点上绘画