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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 22:09:21