似乎无法让pyqt倒数计时器工作

时间:2012-09-30 12:20:56

标签: python timer qt4 pyqt

我已经在互联网上搜索了好几天,但可以弄清楚如何使用此代码。这是一个非常简单的gui(在Qt Designer上制作),带有液晶显示屏和按钮。我希望按下按钮,从180秒后开始倒计时。在第一时刻,我能够使按钮减少一个值,但在尝试了这么多不同的东西后,没有任何工作。有谁可以帮助我吗?可能是非常简单的事情。谢谢。

# -*- coding: utf-8 -*-
import sys
import time
from PyQt4 import QtCore, QtGui
from relogio import Ui_relogiocc

class StartQT4(QtGui.QMainWindow):
 def __init__(self, parent=None):
  QtGui.QWidget.__init__(self, parent)
  self.ui = Ui_relogiocc()
  self.ui.setupUi(self)
  self.timer = QtCore.QTimer()
  text = "%d:%02d" % (180/60,180 % 60)
  self.ui.QLCDNumber.display(text)
  self.timer.start(1000)
  self.ui.iniciar.clicked.connect(self.updateTimerDisplay)


 def updateTimerDisplay(self):
  self.inicio = 180
  while self.inicio != 0:
   text = "%d:%02d" % (self.inicio/60,self.inicio % 60)
   self.ui.QLCDNumber.display(text)
   self.inicio - 1
  else:
   self.timer.stop()  


if __name__ == "__main__":
 app = QtGui.QApplication(sys.argv)
 myapp = StartQT4()
 myapp.show()
 sys.exit(app.exec_())

3 个答案:

答案 0 :(得分:1)

这里似乎有很多东西你不知道。

首先,每当超时周期结束时,定时器会发出timeout()信号。在你的情况下,这是每一秒钟。但是,您没有将此信号连接到任何东西。

其次,您的updateTimerDisplay包含以下行:

   self.inicio - 1

这将读取self.inicio的值,从中减去1,然后将结果抛出。由于self.inicio的值不会改变,因此updateTimerDisplay方法会进入无限循环。

我猜你的意思

   self.inicio -= 1
相反,它将self.inicio的新值分配回自身。

但是,最终,您似乎正在尝试使用updateTimerDisplay方法启动计时器,将其计数并更新计时器的显示。我建议将此方法分解为更小的方法。

首先,updateTimerDisplay应该只更新计时器的显示:

 def updateTimerDisplay(self):
  text = "%d:%02d" % (self.inicio/60,self.inicio % 60)
  self.ui.QLCDNumber.display(text)

其次,您需要一种方法来启动计时器。类似下面的事情应该做:

 def startTimer(self):
  self.inicio = 180
  self.updateTimerDisplay()
  self.timer.start(1000)

当然,您还需要将iniciar按钮的clicked()信号与此功能相关联,而不是updateTimerDisplay

最后,您需要一个处理定时器滴答的方法。类似下面的事情应该做:

 def timerTick(self):
  self.inicio -= 1
  self.updateTimerDisplay()
  if self.inicio <= 0:
   self.timer.stop()

您还需要使用以下内容将计时器的timeout()信号连接到此函数:

  self.timer.timeout.connect(self.timerTick)

答案 1 :(得分:1)

正如在其他答案中所说,你的代码包含一些明显的错误。这里有一个完整的工作示例(UI不是通过Designer创建的),每次单击按钮时都会正确地重置计数器(即在再次启动计时器之前停止计时器。如果不这样做,请单击{{1在计时器停止之前按钮,然后计数器在每次点击按钮时计数更快。

Start

答案 2 :(得分:0)

您的代码存在多处问题。对于初学者,您写了self.inicio - 1而不是-= 1,而您实际上从未使用过您创建的Qtimer。但忽略这一点,您的计划结构不正确:目前,当用户点击您的updateTimerDisplay按钮并在那里循环直到您的倒计时到零时,您会致电iniciar。你想要做的是当用户点击按钮并将计时器(实际上是它的timeout信号)连接到一个只倒计时一秒并更新显示的方法时启动计时器:

def startTimerDisplay(self):
    """ set the countdown value and start the timer """
    self.inicio = 180
    self.timer.start(1000)

def updateTimerDisplay(self):
    """ count down one second, set the text, and check if the timer should stop """
    self.inicio -= 1
    text = "%d:%02d" % (self.inicio/60,self.inicio % 60)
    self.ui.QLCDNumber.display(text)
    if self.inicio == 0:
        self.timer.stop()

更改您的__init__方法以连接这些功能:

def __init__(self, parent=None):
    QtGui.QWidget.__init__(self, parent)
    self.ui = Ui_relogiocc()
    self.ui.setupUi(self)
    self.timer = QtCore.QTimer()
    text = "%d:%02d" % (180/60,180 % 60)
    self.ui.QLCDNumber.display(text)
    #connect the button to the start method ...
    self.ui.iniciar.clicked.connect(self.startTimerDisplay)
    #... and the timer to the update method
    self.timer.timeout.connect(self.updateTimerDisplay)