gpt4 book ai didi

python-3.x - QStatusBar.showMessage() 没有持续更新

转载 作者:行者123 更新时间:2023-12-05 03:59:09 29 4
gpt4 key购买 nike

我的道歉:

这似乎是以下内容的副本: PyQt - running a loop inside GUI

它有一个很好的解决方案和教程链接。

我的设置:

操作系统:Windows 10 ver1903

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 秒,最后无限期状态栏显示“完成调试()”。

ACTUAL: 点击“Debug”按钮,在 cmd 中查看来自 wait() 的打印语句,但我没有看到 “Checkpoint ## #" 更新直到 "Completed debug()"

  • 我尝试过天真地使用内置持续时间参数 statusBar.showMessage()。
  • 我试过使用 time.sleep(2)。
  • 我已经尝试创建自己的等待方法,该方法不应像 sleep 那样暂停进程(以防妨碍)。

我正处于下一步似乎是尝试利用“statusBar.messageChanged”信号的地步,但这对于应该内置的东西来说感觉太多了。我想我错过了一些明显但看不到的东西。

最佳答案

您的示例不起作用,因为 wait 函数中的 while 循环将阻止 gui 并阻止状态栏更新。有几种不同的方法来处理这个问题。如果状态栏更新以固定的时间间隔发生,您可以使用 timer并将插槽连接到其 timeout signal .但是,如果插槽进行了一些繁重的计算,这仍然可能会阻塞 gui - 在这种情况下,您应该将计算移至工作线程,并通过信号将更新发送回主线程(有关简单的信息,请参见 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

关于python-3.x - QStatusBar.showMessage() 没有持续更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57486098/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com