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

PyQt5秒表程序点击启动/重置按钮后崩溃问题求助

PyQt5秒表程序崩溃问题修复

你的代码存在几个关键问题,直接导致了程序崩溃,下面是问题分析和修复方案:

核心问题排查

  • 变量拼写错误:start_timer方法里的self._elapsedtimed是笔误,正确变量名应为self._elapsedtime,这会触发AttributeError直接导致程序崩溃。
  • 跨线程操作UI:PyQt严格禁止在非主线程中修改UI控件,你用threading.Thread启动_update更新UI属于违规操作,必然引发崩溃。同时start_timer里既启动线程又直接调用_update,逻辑重复混乱。
  • 时间格式化函数缺失计算逻辑:format_time_string里直接使用hours、mins、secs但未提前计算,会触发NameError。
  • 错误复用tkinter方法:PyQt没有self.after方法,这是tkinter的定时方式,PyQt需用QTimer实现定时更新。
  • 控件方法调用错误:重置时self.timer_s1.set("00:00:00"),如果是QLCDNumber控件应使用display方法;如果是QLabel则用setText,需保持调用统一。

修复后的完整代码

import time
from PyQt5 import uic
from PyQt5.QtWidgets import (
    QApplication,
    QLabel,
    QLCDNumber,
    QMainWindow,
    QWidget,
)
from PyQt5.QtCore import QTimer

class MyGUI(QMainWindow):
    def __init__(self):
        super(MyGUI, self).__init__()
        uic.loadUi("stopwatch.ui", self)
        self.show()
        self._start = 0.0
        self._elapsedtime = 0.0
        self._running = 0

        # 初始化定时刷新器
        self.update_timer = QTimer(self)
        self.update_timer.timeout.connect(self._update)
        self.update_timer.setInterval(100)  # 每100ms刷新一次

        self.canvas_s1.setStyleSheet("background-color: yellow")

        self.start_s1.clicked.connect(self.start_timer)
        self.stop_s1.clicked.connect(self.stop_timer)
        self.reset_s1.clicked.connect(self.reset_timer)
            
    def start_timer(self):
        if not self._running:
            self._start = time.time() - self._elapsedtime
            self._running = 1
            self.update_timer.start()
            self.canvas_s1.setStyleSheet("background-color: green")

    def stop_timer(self):
        self._running = 0
        self.update_timer.stop()
        self.canvas_s1.setStyleSheet("background-color: red")
    
    def reset_timer(self):
        self._running = 0
        self.update_timer.stop()
        self._elapsedtime = 0.0
        # 根据控件类型选择对应方法
        if isinstance(self.timer_s1, QLCDNumber):
            self.timer_s1.display("00:00:00")
        else:
            self.timer_s1.setText("00:00:00")
        self.canvas_s1.setStyleSheet("background-color: yellow")
        
    def format_time_string(self, time_passed):
        secs = time_passed
        mins = secs // 60
        secs = secs % 60
        hours = mins // 60
        mins = mins % 60
        return f"{int(hours):02d}:{int(mins):02d}:{int(secs):02d}"

    def _update(self):
        if self._running:
            self._elapsedtime = time.time() - self._start
            time_str = self.format_time_string(self._elapsedtime)
            if isinstance(self.timer_s1, QLCDNumber):
                self.timer_s1.display(time_str)
            else:
                self.timer_s1.setText(time_str)
            if self._elapsedtime > 15:
                self.canvas_s1.setStyleSheet("background-color: orange")

def main():
    app = QApplication([])
    window = MyGUI()
    app.exec_()

if __name__ == "__main__":
    main()

关键修改说明

  1. 用QTimer替代线程和after方法,确保所有UI操作都在主线程执行,彻底解决跨线程崩溃问题。
  2. 修正变量拼写错误,保证变量名一致性。
  3. 完善format_time_string函数,正确计算时分秒并格式化。
  4. 给start_timer增加判断逻辑,避免重复启动定时器。
  5. 根据控件类型统一调用display或setText方法,适配不同UI控件类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 01:09:56