用processEvents()更新QLCDNumber - Python 3

时间:2013-09-16 04:05:02

标签: python qt pyside

天儿真好,

我正在尝试在我的软件中加入一个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()处理程序......

谢谢!

1 个答案:

答案 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()运行所需的时间,这可能不会以你想要的方式结束。