QStatusBar.showMessage()更新不一致 [英] QStatusBar.showMessage() not updating consistently

查看:0
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆