Python Can';看来pyqt倒计时器不起作用了

Python Can';看来pyqt倒计时器不起作用了,python,timer,qt4,pyqt,Python,Timer,Qt4,Pyqt,我已经在互联网上搜索了好几天,但我知道如何使用这些代码。这是一个非常简单的gui(在Qt Designer上制作),带有一个lcd和一个按钮。我想让它在按下按钮后从180秒开始倒计时。在第一个时刻,我能够使按钮的值减少一个,但在尝试了这么多不同的事情后,什么都不起作用。有人能帮我吗?可能是很简单的事情。多谢各位 # -*- coding: utf-8 -*- import sys import time from PyQt4 import QtCore, QtGui from relogio i

我已经在互联网上搜索了好几天,但我知道如何使用这些代码。这是一个非常简单的gui(在Qt Designer上制作),带有一个lcd和一个按钮。我想让它在按下按钮后从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_())

您的代码有多处错误。首先,您编写了
self.inicio-1
,而不是
-=1
,并且从未实际使用您创建的
Qtimer
。但是忽略这一点,您的程序结构是不正确的:当前,当用户单击您的
iniciar
按钮时,您调用
updatetimedisplay
,并在那里循环,直到您的倒计时达到零。您要做的是在用户单击按钮时启动计时器,并将计时器(实际上是其
超时
信号)连接到只需倒计时一秒并更新显示的方法:

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()
更改
\uuuu init\uuuu
方法以如下方式连接这些函数:

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)

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

首先,每当每个超时时间结束时,计时器都会发出一个
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)
 def timerTick(self):
  self.inicio -= 1
  self.updateTimerDisplay()
  if self.inicio <= 0:
   self.timer.stop()
当然,您还需要将iCIAR中的
iniciar
按钮的
clicked()
信号连接到此函数,而不是连接到
updateimerdisplay

最后,您需要一个方法来处理计时器的滴答声。类似于以下的操作应该可以做到:

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

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