在pyqt中使用计时器时出现奇怪的Python行为
通过这段代码,我希望看到两种不同类型的输出,它们在计时器id上有所不同。但是输出是:在pyqt中使用计时器时出现奇怪的Python行为,python,pyqt,Python,Pyqt,通过这段代码,我希望看到两种不同类型的输出,它们在计时器id上有所不同。但是输出是: import sys from PyQt4 import QtGui from PyQt4.QtCore import QObject, QBasicTimer class Example(QObject): def timerEvent(self, event): print "timer event, timer Id:", event.timerId() def ma
import sys
from PyQt4 import QtGui
from PyQt4.QtCore import QObject, QBasicTimer
class Example(QObject):
def timerEvent(self, event):
print "timer event, timer Id:", event.timerId()
def main():
app = QtGui.QApplication(sys.argv)
ex = Example()
timer = QBasicTimer()
timer.start(500, ex)
print timer
timer = QBasicTimer()
timer.start(300, ex)
print timer
sys.exit(app.exec_())
#Run it
main()
然后我得到了预期的结果:
timer = QBasicTimer()
timer.start(500, ex)
print timer
timer2 = QBasicTimer()
timer2.start(300, ex)
print timer2
计时器事件,计时器Id:16777218
计时器事件,计时器Id:1
计时器事件,计时器Id:16777218
计时器事件,计时器Id:16777218
计时器事件,计时器Id:1
计时器事件,计时器Id:16777218
计时器事件,计时器Id:1
计时器事件,计时器Id:16777218
计时器事件,计时器Id:16777218
计时器事件,计时器Id:1
我试图理解Python,这让我很困惑。是什么导致了这种行为?变量名如何改变程序?我不知道你为什么会认为这种行为很奇怪。事件的顺序很简单:
<PyQt4.QtCore.QBasicTimer object at 0x17b3b90>
<PyQt4.QtCore.QBasicTimer object at 0x17b3c08>
timer event, timer Id: 16777218
timer event, timer Id: 1
timer event, timer Id: 16777218
timer event, timer Id: 16777218
timer event, timer Id: 1
timer event, timer Id: 16777218
timer event, timer Id: 1
timer event, timer Id: 16777218
timer event, timer Id: 16777218
timer event, timer Id: 1
所以这只是工作中的普通python垃圾收集。创建具有相同名称的第二个对象将删除对第一个对象的唯一引用,第一个对象将立即被垃圾回收。当然,第二个对象本身不会被垃圾回收,因为事件循环阻止函数返回
如果您没有阅读文档,我想您可能会认为这一行:
ex = Example()
# timer(1) object is created
timer = QBasicTimer()
# ex object registers timer(1)
timer.start(500, ex)
print timer
# timer(2) object is created
# timer(1) object is destroyed
# timer(1) destructor unregisters timer(1)
timer = QBasicTimer()
# ex object registers timer(2)
timer.start(300, ex)
print timer
# event loop starts, 300ms later, timer(2) event is processed...
sys.exit(app.exec_())
将使ex
成为timer
的父对象,从而使其保持活动状态。但要让它起作用,QBasicTimer
必须是QObject
的子类,而事实并非如此
QBasicTimer.start()
方法实际上与此等效:
timer.start(500, ex)
我阅读了
QBasicTimer
的文档,但是没有提到实现。想到我应该从哪里得到这个想法,还有什么其他神秘的问题等着我,我有点害怕。不管怎么说,在执行过程中,定时器会被破坏。@ LeNoob。你不需要理解实现:我只是想解释一下发生了什么。但我还是很惊讶你认为这一切都是“神秘的”。您是Python新手还是PyQt新手?计时器在“执行过程中”没有被销毁,因为在事件循环开始之前,不会发生任何事情(就事件而言)。在任何情况下,Qt定时器设计的一部分是当它们被删除时自动停止。这对您来说似乎不合理吗?我对Python比较陌生,对PyQt也完全陌生:)我主要是Java开发人员,显然在掌握Python的内部结构方面存在问题,在本例中,垃圾收集是如何工作的(这里更不用提线程omg了)。我试着阅读文档和资料,但我就是搞不懂。
timer.start(500, ex)
def start(self, msec, obj):
self.stop()
if obj is not None:
self.id = obj.startImer(msec)