0

我正在尝试使用带有 pyqt 的计时器。代码如下,但它不打印任何东西,我也没有收到错误。有谁知道出了什么问题?
谢谢

import functools
from PyQt4.QtCore import QTimer

def onTimer(initParams):
    print initParams
    print "HERE"
    # your code here...
def update():
    print "Upd"
myInitParams = "Init!"
timerCallback = functools.partial(onTimer, myInitParams)
myTimer = QTimer()
myTimer.timeout.connect(timerCallback)
myTimer.start(1000) #once a sec

t = QTimer()

t.start(500)
t.timeout.connect(update)

编辑更新:

所以这是我使用的完整代码的一个片段,它有点复杂,可能是一个不同的问题,但结果是一样的。

结构是这样的:

from PyQt4 import QtCore, QtGui
# Import the UI Classes from the ui directory in this package
from ui.MoAnGUI import Ui_MoAnWindow

class MoAnWin(QtGui.QDialog, Ui_MoAnWindow):
    def __init__(self, parent=None):
        super(MoAnWin, self).__init__(parent=parent)

        self.setupUi(self)
        self.playMarkers.clicked.connect(self._PlayMarkers)
        self.connect(self,QtCore.SIGNAL("PlayMarker"),PlayMarkerCall)
        #Marker Stop
        self.stopMarkers.clicked.connect(self._StopMarkers)
        self.connect(self,QtCore.SIGNAL("StopMarker"),StopMarkerCall)

    def _StopMarkers(self):
        arg = "Stop"
        self.emit(QtCore.SIGNAL("StopMarker"),arg)
    def _PlayMarkers(self):
        fps = self.fpsBox.value()
        starttime = self.fromTime.value()
        endtime = self.ToTime.value()
        arg = [fps,starttime,endtime]
        self.emit(QtCore.SIGNAL("PlayMarker"),arg)

def StopMarkerCall(arg):
    #I want to stop the timer here

def PlayMarkerCall(arg):

    #I tried this, but again, nothing happens, no error
    myInitParams = "Init!"
    timerCallback = functools.partial(TimerCall, myInitParams)
    myTimer = QtCore.QTimer()
    myTimer.timeout.connect(timerCallback)
    myTimer.start(1000) #once a sec

    #I Imagine something like this:
    myTimer = QtCore.QTimer()
    for i in range(start,end):
         # I want to connect to my view marker function but i need to pass a variable
         myTimer.timeout.connect(ViewMarkerCall(i))
         myTimer.start(1000)
def TimerCall(args):
    print "HERE", args

def show():
    global globalMoAnWindow
    app = QtGui.QApplication(sys.argv)
    globalMoAnWindow = MoAnWin()
    globalMoAnWindow.show()
    sys.exit(app.exec_())
    return globalMoAnWindow

show()

我的目标是让一个按钮单击播放,并且在某个时间间隔在 qtgraphic 小部件中发生一些事情,然后停止按钮停止播放。我在这里的另一个问题中找到了 functools,但我不确定它是否正确。

4

1 回答 1

2

要正确使用 Qt,您需要设置一个QtGui.QApplicationorQtCore.QCoreApplication并使用它的事件循环来处理事件。

这应该有效:

#from utils import sigint

import functools
from PyQt4.QtCore import QTimer, QCoreApplication
app = QCoreApplication([])

def onTimer(initParams):
    print initParams
    print "HERE"
    # your code here...
def update():
    print "Upd"
myInitParams = "Init!"
timerCallback = functools.partial(onTimer, myInitParams)
myTimer = QTimer()
myTimer.timeout.connect(timerCallback)
myTimer.start(1000) #once a sec

t = QTimer()

t.start(500)
t.timeout.connect(update)

# use a timer to stop the event loop after some time
stopTimer = QTimer(timeout=app.quit, singleShot=True)
stopTimer.start(4000)

app.exec_()

编辑:

在您的更新版本中,您不会保留对您在PlayMarkerCall方法中创建的计时器对象的任何引用。当myTimer超出范围时,它会被销毁(连同底层的 C++ Qt 对象),这就是你的计时器永远不会触发的原因。
并且在将信号连接到插槽时无法传递参数,当时您只需设置连接。只能在发出信号时传递参数,为此,您可以创建一个派生自QTimer并覆盖它的timerEvent方法以发出带有在实例化 Timer 时指定的参数的信号。

于 2013-05-14T10:13:38.800 回答