【发布时间】:2019-08-13 22:34:19
【问题描述】:
我的道歉:
这似乎与以下内容重复: PyQt - running a loop inside GUI
有很好的解决方案和教程链接。
我的设置:
操作系统:Windows 10 版本 1903
Python:3.7.4
PyQt5:5.13.0
我的问题:
PyQt5 不会持续更新状态栏。 我在更大的应用程序中看到了这个问题。 我写了这个调试应用程序来尝试更清楚地识别问题,它已经重现:
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秒,最后状态栏无限期显示“Completed debug()”。
实际:单击“调试”按钮,在 cmd 中查看来自wait() 的打印语句,但在"Completed debug()" 之前我看不到任何"Checkpoint ###" 更新。
- 我尝试过使用内置的持续时间参数 statusBar.showMessage() 天真地。
- 我已尝试使用 time.sleep(2)。
- 我已尝试创建自己的等待方法,它不应像 sleep 那样暂停进程(以防碍事)。
我的下一步似乎是尝试利用“statusBar.messageChanged”信号,但这对于应该内置的东西来说感觉太多了。我想我错过了很明显但看不到的东西。
【问题讨论】:
-
感谢@ekhumoro,我相信你是 100% 正确的。我也是在睡了一觉并和朋友讨论之后才意识到这一点的。感谢大家的有益回复!如果您将其列为答案,我可以将其标记为回答我的问题。
标签: python-3.x pyqt pyqt5 sleep qstatusbar