我已经在互联网上搜索了好几天,但可以弄清楚如何使用此代码。这是一个非常简单的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_())
答案 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)