我很抱歉:
这似乎是一个复制:PyQt -在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()期望值:单击"Debug“按钮,看到"Checkpoint ###"周期性地在状态栏中打印2秒,最后显示”已完成的调试()“的状态条。
updates:单击"Debug“按钮,在cmd中查看来自wait()的打印语句,但在"Completed debug()"之前没有看到任何"Checkpoint ###"更新。
我的下一步似乎是尝试利用"statusBar.messageChanged“信号,但对于应该内置的东西来说,这感觉太多了。我想我错过了一些显而易见的东西,但看不见。
发布于 2019-08-14 18:58:33
您的示例不起作用,因为wait函数中的while-循环将阻止gui并阻止状态栏更新。处理这个问题有几种不同的方法。如果状态栏更新间隔固定,您可以使用一个计时并将一个插槽连接到它的超时信号。但是,如果插槽进行了一些繁重的计算,这仍然会阻塞gui --在这种情况下,您应该将计算移到工作线程中,并通过signal将更新发送回主线程(参见这里中的一个简单示例)。然后,如果您只需要一个快速和肮脏的调试方法,您可以使用过程-事件临时强制gui更新。例如,您的示例中的wait函数可以这样工作:
def wait(self, duration=2.0):
qApp.processEvents() # clear current event queue
time.sleep(duration) # this will block gui updates发布于 2019-08-13 23:26:34
试一试:
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)
self.msgs = ["Checkpoint 001", "Checkpoint 002", "Checkpoint 003", "Completed debug()"] # +
self.n = len(self.msgs) # +
self.i = 0 # +
qpb = QPushButton("Debug")
qpb.clicked.connect(self.debug)
self.setCentralWidget(qpb)
self.statusBar = QStatusBar()
self.setWindowTitle("QStatusBar Debug")
self.setStatusBar(self.statusBar)
self.timer = QTimer(self) # +
self.timer.setInterval(2000)
self.timer.timeout.connect(self.show_message)
def show_message(self):
self.statusBar.showMessage(self.msgs[self.i])
self.i += 1
if self.i == self.n:
self.timer.stop()
self.i = 0
def debug(self):
self.timer.start()
def main():
app = QApplication(sys.argv)
ex = statusdemo()
ex.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()

https://stackoverflow.com/questions/57486098
复制相似问题