0

天,

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

谢谢!

4

1 回答 1

2

此页面包含一些信息,但我将在此处总结可能对您有帮助的内容。看起来您可能遇到的睡眠问题源于这样一个事实,即如果发生这种情况时系统很忙,则一旦程序完成睡眠,执行可能不会立即恢复。

以下函数建立一个 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() 运行所需的时间上,这可能不会以您想要的方式结束。

于 2013-09-16T05:27:07.553 回答