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

QtGui.QApplicationQt を正しく使用するには、 orを設定し、そのQtCore.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 に答える