使用 processEvents() 更新 QLCDNumber - Python 3
Posted
技术标签:
【中文标题】使用 processEvents() 更新 QLCDNumber - Python 3【英文标题】:QLCDNumber updating with processEvents() - Python 3 【发布时间】:2013-09-16 04:05:01 【问题描述】:生日,
我正在尝试在我的软件中包含一个 LCD 倒数计时器。这是我目前拥有的,尝试使用 processEvents()。
n = 6
while n > -1:
self.LCDTransactionCountdown.display(n)
QtCore.QCoreApplication.processEvents()
n = n - 1
time.sleep(1)
print("Session expired.")
我在其他地方读到过这个话题,我发现 time.sleep() 命令不适合这个任务?当我运行上面的代码时,LCD 会显示一个倒计时,但它会在一个数字上暂停稍微太久,然后跳过下面的数字。我在 while 循环中添加了一个 print(n) 行,以检查循环是否按计划运行。
我读过 QTimer 会更适合这项任务,但对于我来说,我无法理解 PySide 的文档。我已经阅读了关于 QTimer 的文档,但我不明白为什么我需要为此使用 SIGNALS 和 SLOTS?
希望我在这里错过了一些非常简单的事情。我感觉我没有正确使用 processEvents() 处理程序...
谢谢!
【问题讨论】:
【参考方案1】:This page 有一些信息,但我会在这里总结一下可能对您有帮助的内容。看起来您可能遇到的睡眠问题源于这样一个事实:如果发生这种情况时系统正忙,则程序一旦完成睡眠就可能不会恢复执行。
以下函数建立一个 QTimer 以每秒触发函数 f。
QTimer.singleShot(1000, f)
在您的 while 循环中使用它来触发 QtCore.QCoreApplication.processEvents()
可能会解决您的问题。需要注意的一点是,直到第一秒结束后它才会触发。要第一次触发该方法,请使用QTimer.singleShot(0, f)
。
另一种方法是运行源链接中列出的计时器的第二种方式。
timer = QTimer()
timer.timeout.connect(QtCore.QCoreApplication.processEvents()) #This gets run every timer cycle
timer.start(1000)
看来这个方法和singleshot()
的方法很相似,不过我都发了,以防第一个不能正常工作。
如果您仍然遇到问题,请尝试这样做
def myFunction():
try:
QtCore.QCoreApplication.processEvents()
finally:
QTimer.singleShot(1000, myFunction())
这将导致 processEvents 触发,然后每秒排队。由于它在 finally 语句中,即使 processEvents 中断它也会再次触发。缺点是 1 秒的等待时间会添加到 processEvents() 运行所需的时间上,这可能不会以您希望的方式结束。
【讨论】:
抱歉,回复晚了!你的帖子让我更好地理解了 QTimer 类,所以谢谢你。我希望 PySide 文档是直截了当的......以上是关于使用 processEvents() 更新 QLCDNumber - Python 3的主要内容,如果未能解决你的问题,请参考以下文章
为啥需要 processEvents() 才能让 QThread 工作?
QCoreApplication.processEvents 行为
Qt 循环中加入QCoreApplication::processEvents退出后台运行
Python-QApplication.processEvents()的使用,解决pyqt 的textEdit内容无法实时刷新
Qt学习之系列[9] – QCoreApplication:processEvents()可能会引起递归,导致栈溢出崩溃