Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在pyqt中使用计时器时出现奇怪的Python行为_Python_Pyqt - Fatal编程技术网

在pyqt中使用计时器时出现奇怪的Python行为

在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

通过这段代码,我希望看到两种不同类型的输出,它们在计时器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 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)