【问题标题】:Can't seem to get pyqt countdown timer to work似乎无法让 pyqt 倒数计时器工作
【发布时间】:2012-09-30 12:20:56
【问题描述】:

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

【问题讨论】:

    标签: python timer qt4 pyqt


    【解决方案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)
    

    【讨论】:

      【解决方案2】:

      正如其他答案中所说,您的代码包含一些明显的错误。在这里,您有一个完整的工作示例(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_())
      

      【讨论】:

        【解决方案3】:

        您的代码有很多问题。首先,您写的是self.inicio - 1 而不是-= 1,并且您从未真正使用过您创建的Qtimer。但是忽略这一点,您的程序结构不正确:当前,当用户单击您的 iniciar 按钮并在那里循环直到您的倒计时达到零时,您调用 updateTimerDisplay。您要做的是在用户单击按钮时启动计时器并将计时器(实际上是它的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)
        

        【讨论】:

          猜你喜欢
          • 2011-11-30
          • 2015-09-20
          • 2011-11-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-26
          相关资源
          最近更新 更多