You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PyQt的PushButton文本中实时更新计时器数值

Hey there! Let's fix your PyQt timer issue step by step. Your current code has a few key problems that are preventing real-time updates and proper GUI behavior:

  • Blocking the main thread: Using input() and time.sleep() freezes the entire GUI because Qt can't process events while these are running.
  • Synchronous timer function: Your timer() function runs a loop that only returns after the countdown finishes, so the button text never updates during the countdown.
  • Incorrect UI update flow: The button text is set once when the window loads, not refreshed as the timer counts down.

Here's a revised version of your code that fixes all these issues while keeping your original goal intact:

import sys
from PyQt4 import QtCore, QtGui

class Window(QtGui.QMainWindow):
    def __init__(self):
        super(Window, self).__init__()
        self.setGeometry(50, 50, 500, 300)
        self.setWindowTitle("PyQT Timer")
        self.setWindowIcon(QtGui.QIcon('pythonlogo.png'))
        
        # Get initial time from user using Qt's native input dialog
        self.remaining_time, ok = QtGui.QInputDialog.getInt(
            self, "Set Timer", "Enter time in seconds:", min=0
        )
        if not ok:
            # Close app if user cancels the input dialog
            QtCore.QCoreApplication.instance().quit()
            
        self.home()
        self.start_timer()

    def home(self):
        self.btn = QtGui.QPushButton(self)
        self.btn.resize(100, 100)
        self.btn.move(100, 100)
        # Set initial button text with formatted time
        self.update_button_text()
        self.btn.clicked.connect(QtCore.QCoreApplication.instance().quit)
        self.show()

    def start_timer(self):
        # Use QTimer to trigger updates every 1 second (1000ms)
        self.timer = QtCore.QTimer(self)
        self.timer.timeout.connect(self.update_timer)
        self.timer.start(1000)

    def update_timer(self):
        if self.remaining_time > 0:
            self.remaining_time -= 1
            self.update_button_text()
        else:
            self.timer.stop()
            self.btn.setText("Done!")

    def update_button_text(self):
        # Format remaining time into HH:MM:SS format
        m, s = divmod(self.remaining_time, 60)
        h, m = divmod(m, 60)
        time_str = f"{h:02d}:{m:02d}:{s:02d}"
        self.btn.setText(time_str)

def run():
    app = QtGui.QApplication(sys.argv)
    GUI = Window()
    sys.exit(app.exec_())

if __name__ == "__main__":
    run()

Key Changes Explained:

  1. Non-blocking User Input: We replaced input() with QInputDialog.getInt()—this is a Qt-native dialog that doesn't block the event loop, so your window loads properly while getting user input.
  2. QTimer for Responsive Updates: Instead of time.sleep(), we use QTimer which runs in the background and calls update_timer() every second. This keeps the GUI responsive so you can interact with the button or window while the timer runs.
  3. Instance Variable for Time Tracking: We use self.remaining_time to track the time left, which is cleaner and more maintainable than global variables.
  4. Real-Time Button Updates: The update_button_text() method formats the time string and updates the button every second, so you see the countdown live.
  5. Clean Timer Stop Logic: When the timer reaches 0, we stop the timer and update the button to show "Done!".

内容的提问来源于stack exchange,提问作者aman rawat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:43:16