PyQt5中QTimer绑定的timeout回调事件未执行问题求助
问题原因
- 核心故障点:你在
change_time()函数内部创建的QTimer实例是局部作用域变量,函数执行完成后,该变量会被Python垃圾回收机制自动销毁。定时器对象在1秒的触发间隔到来前就已经被释放,因此永远不会触发绑定的update_time槽函数,只会打印函数执行时的"start"输出。 - 附加语法问题:你贴出的代码中
if __name__ == "__main__":块下的语句存在缩进错误,直接运行会抛出语法异常,属于代码粘贴时的格式疏漏。
解决方法
- 延长
QTimer实例的生命周期:将定时器对象的引用存放在不会随函数执行结束被回收的作用域中,比如全局作用域、Qt窗口类的实例属性,保证定时器在程序运行期间持续存在。 - 修正代码块的缩进错误。
修正后可运行代码
from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtCore import QTimer, QTime import sys # 全局作用域持有定时器引用,避免被提前回收 timer = None def change_time(): global timer timer = QTimer() timer.timeout.connect(update_time) timer.start(1000) print("start") def update_time(): current_time = QTime.currentTime() print("executed", current_time.toString("hh:mm:ss")) if __name__ == "__main__": app = QtWidgets.QApplication(sys.argv) change_time() sys.exit(app.exec_())
开发提示:如果是基于QWidget/QMainWindow的正式GUI项目,更推荐把定时器作为窗口类的实例属性创建,同时给QTimer指定父窗口对象(例如
self.timer = QTimer(self)),这种写法既可以避免垃圾回收问题,还能让定时器随窗口销毁自动释放资源,符合Qt的对象生命周期管理规范。
内容的提问来源于stack exchange,提问作者Dan Sewell
相关产品推荐
相关产品推荐

