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()
关键修改说明
- 用
QTimer替代线程和after方法,确保所有UI操作都在主线程执行,彻底解决跨线程崩溃问题。 - 修正变量拼写错误,保证变量名一致性。
- 完善
format_time_string函数,正确计算时分秒并格式化。 - 给
start_timer增加判断逻辑,避免重复启动定时器。 - 根据控件类型统一调用
display或setText方法,适配不同UI控件类型。
内容的提问来源于stack exchange,提问作者user12485898
相关产品推荐
相关产品推荐

