QStatusBar.showMessage()更新不一致 [英] QStatusBar.showMessage() not updating consistently
本文介绍了QStatusBar.showMessage()更新不一致的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我的道歉:
这似乎是以下内容的副本: PyQt - running a loop inside GUI其中有很好的解决方案和教程链接。
我的设置:
操作系统:Windows 10 Ver1903
Python:3.7.4
PyQt5:5.13.0
我的问题:
PyQt5没有一致地更新statusBar。 我在一个更大的应用程序中看到了这个问题。 我写了这个调试应用程序,试图更清楚地识别问题,它已经重现了:
import sys, time
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class statusdemo(QMainWindow):
def __init__(self, parent = None):
super(statusdemo, self).__init__(parent)
qpb = QPushButton("Debug")
qpb.clicked.connect(self.debug)
self.setCentralWidget(qpb)
self.statusBar = QStatusBar()
self.setWindowTitle("QStatusBar Debug")
self.setStatusBar(self.statusBar)
def wait(self, duration=2.0):
print(f"waiting for {duration}")
tstart = time.time()
while(True):
if duration < (time.time() - tstart):
break
def debug(self):
# self.statusBar.showMessage("Checkpoint 001", 2000)
self.statusBar.showMessage("Checkpoint 001")
# time.sleep(2)
self.wait()
# self.statusBar.showMessage("Checkpoint 002", 2000)
self.statusBar.showMessage("Checkpoint 002")
# time.sleep(2)
self.wait()
# self.statusBar.showMessage("Checkpoint 003", 2000)
self.statusBar.showMessage("Checkpoint 003")
# time.sleep(2)
self.wait()
# self.statusBar.showMessage("Completed debug()", 2000)
self.statusBar.showMessage("Completed debug()")
def main():
app = QApplication(sys.argv)
ex = statusdemo()
ex.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
预期:单击"调试"按钮,看到"Checkpoint ###"
在状态栏中定期打印2秒,以不确定的状态栏显示"已完成调试()"结束。
实际:单击"调试"按钮,查看cmd中wait()
的打印语句,但我在"Completed debug()"
之前没有看到任何"Checkpoint ###"
更新。
- 我已尝试使用内置持续时间参数statusBar.showMessage()。
- 我已尝试使用时间。睡眠(2)。
- 我已尝试创建自己的等待方法,该方法不应像睡眠那样挂起进程(以防这会妨碍进程)。
我认为下一步似乎是尝试利用"statusBar.MessageChanged"信号,但对于应该内置的东西来说,这感觉太多了。我想我错过了一些明显的东西,但我看不到它。
推荐答案
您的示例不起作用,因为wait
函数中的While循环将阻塞图形用户界面并阻止状态栏更新。有几种不同的方法来处理这个问题。如果状态栏更新以固定的间隔进行,您可以使用timer并将插槽连接到其timeout signal。然而,如果槽执行一些繁重的计算,这仍然可能会阻塞图形用户界面-在这种情况下,您应该将计算移动到工作线程中,并通过信号将更新发送回主线程(参见here以获取简单的示例)。同样,如果您只需要一种快速而肮脏的方法进行调试,您可以使用process-events临时强制进行gui更新。例如,您的示例中的wait
函数可以这样工作:
def wait(self, duration=2.0):
qApp.processEvents() # clear current event queue
time.sleep(duration) # this will block gui updates
这篇关于QStatusBar.showMessage()更新不一致的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文