如何通过单个回调管理多个PyQt5 QTimer并识别到期定时器?
在PyQt5中判断触发回调的QTimer实例
当然有符合PyQt架构规范的简洁方法,常用的有两种:
方法一:使用QObject.sender()获取信号源
PyQt的QObject类自带sender()方法,能在回调函数里直接拿到触发当前信号的对象实例。你可以通过这个方法获取到期的QTimer,再通过它的objectName属性或者直接比较对象引用来区分不同定时器。
示例代码:
from PyQt5.QtCore import QTimer, QCoreApplication def on_timer_timeout(): timer = QTimer.sender() # 通过objectName区分 if timer.objectName() == "timer1": print("定时器1到期") elif timer.objectName() == "timer2": print("定时器2到期") # 也可以直接比较对象引用 # if timer is timer1: # print("定时器1到期") if __name__ == "__main__": app = QCoreApplication([]) timer1 = QTimer() timer1.setObjectName("timer1") timer1.timeout.connect(on_timer_timeout) timer1.start(1000) timer2 = QTimer() timer2.setObjectName("timer2") timer2.timeout.connect(on_timer_timeout) timer2.start(2000) app.exec_()
方法二:用Lambda表达式绑定标识参数
创建QTimer时,通过lambda表达式把定时器实例或者自定义标识传递给回调函数,这样回调里能直接拿到区分信息,无需依赖sender()。
示例代码:
from PyQt5.QtCore import QTimer, QCoreApplication def on_timer_timeout(timer): if timer.objectName() == "timer1": print("定时器1到期") elif timer is timer2: print("定时器2到期") if __name__ == "__main__": app = QCoreApplication([]) timer1 = QTimer() timer1.setObjectName("timer1") timer1.timeout.connect(lambda: on_timer_timeout(timer1)) timer1.start(1000) timer2 = QTimer() timer2.timeout.connect(lambda: on_timer_timeout(timer2)) timer2.start(2000) app.exec_()
这两种方法都完全符合PyQt的架构规范:第一种适合不想修改回调函数参数的场景,第二种更直观,还能灵活传递自定义的区分标识。
内容的提问来源于stack exchange,提问作者eklektek
相关产品推荐
相关产品推荐

