我很抱歉:
这似乎是重复的: PyQt - 在 GUI 内运行循环
有一个很好的解决方案和教程链接。
我的设置:
操作系统:Windows 10 版本 1903
蟒蛇: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()
预期:单击“调试”按钮并"Checkpoint ###"
定期在状态栏中看到打印 2 秒,最后状态栏显示“已完成调试()”。
实际:单击“调试”按钮,查看 cmd 中的打印语句wait()
,但"Checkpoint ###"
直到"Completed debug()"
.
- 我尝试过使用内置的持续时间参数 statusBar.showMessage() 天真。
- 我尝试过使用 time.sleep(2)。
- 我尝试创建自己的等待方法,它不应该像 sleep 那样暂停进程(以防碍事)。
我正处于下一步似乎是尝试利用“statusBar.messageChanged”信号的地步,但这对于应该内置的东西来说感觉太多了。我想我错过了一些明显的东西,但是看不到它。