蒂姆,好像没法让pyqt倒计时

2024-10-01 00:25:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我在网上搜索了好几天,但我能想出如何把这段代码付诸实施。这是一个非常简单的gui(在Qt设计器上制作),有一个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_())

Tags: textfromimportselfuisys事情按钮
3条回答

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

from PyQt4.QtGui import *
from PyQt4.QtCore import *

class MyMainWindow(QMainWindow):
    def __init__(self, parent=None):
        QMainWindow.__init__(self, parent)

        self.central = QWidget(self)
        self.hbox = QHBoxLayout(self.central)
        self.lcd = QLCDNumber(self.central)
        self.timer = QTimer(self)
        self.start_time = 20
        self.lcd.display("%d:%02d" % (self.start_time/60,self.start_time % 60))
        self.start_button = QPushButton("Start", self.central)
        self.hbox.addWidget(self.lcd)
        self.hbox.addWidget(self.start_button)
        self.setCentralWidget(self.central)

        self.start_button.clicked.connect(self.restartTimer)
        self.timer.timeout.connect(self.updateLCD)

    def restartTimer(self):
        # Reset the timer and the lcd
        self.timer.stop()
        self.start_time = 20
        self.lcd.display("%d:%02d" % (self.start_time/60,self.start_time % 60))
        # Restart the timer
        self.timer.start(1000)

    def updateLCD(self):
        # Update the lcd
        self.start_time -= 1
        if self.start_time >= 0:
            self.lcd.display("%d:%02d" % (self.start_time/60,self.start_time % 60))
        else:
            self.timer.stop()

if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    ui = MyMainWindow()
    ui.show()
    sys.exit(app.exec_())

看来你在这里遗漏了很多东西。在

首先,每当每个超时周期结束时,计时器都会发出timeout()信号。对你来说,这是每一秒。但是,你不能把这个信号和任何东西联系起来。在

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

   self.inicio - 1

这将读取self.inicio的值,从中减去1,然后丢弃结果。因为self.inicio的值不会改变updateTimerDisplay方法进入一个无限循环。在

我猜你是说

^{pr2}$

相反,它将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)

您的代码有多处错误。首先,您编写了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__方法,如下所示连接这些函数:

^{pr2}$

相关问题 更多 >