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 告诉我这个小部件不存在?