Python Can';看来pyqt倒计时器不起作用了
我已经在互联网上搜索了好几天,但我知道如何使用这些代码。这是一个非常简单的gui(在Qt Designer上制作),带有一个lcd和一个按钮。我想让它在按下按钮后从180秒开始倒计时。在第一个时刻,我能够使按钮的值减少一个,但在尝试了这么多不同的事情后,什么都不起作用。有人能帮我吗?可能是很简单的事情。多谢各位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
# -*- 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创建的),它可以在每次单击按钮时正确重置计数器(即,在再次启动计时器之前停止计时器。如果不这样做,并在计时器停止之前单击
启动
按钮,则每次单击按钮计数器计数都会更快)