天儿真好,
我正在尝试在我的软件中加入一个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()命令不适合这个任务?当我运行上面的代码时,液晶显示屏将显示排序倒计时,但它会在一个数字上暂停一段时间,然后跳过以下数字。我在while循环中添加了一行print(n)行,以检查循环是否按计划运行,它是。
我已经读过QTimer更适合这项任务,但对于我的生活,我无法理解PySide的文档。我已经阅读了有关QTimer的文档,但我不明白为什么我需要为此目的使用SIGNALS和SLOTS?
希望我在这里错过了一些非常简单的事情。我有一种感觉,我没有正确使用processEvents()处理程序......
谢谢!
答案 0 :(得分:2)
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触发,然后在每秒后排队。因为它处于最终的状态,即使processEvents中断,它也会再次触发。缺点是1秒的等待时间会增加到processEvents()运行所需的时间,这可能不会以你想要的方式结束。