2013-05-14 2 views
0

pyqt와 함께 타이머를 사용하려고합니다. 아래 코드는 있지만 아무것도 인쇄하지 않으며 오류가 발생하지 않습니다. 누가 잘못되었는지 아는 사람 있습니까?
감사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) 

편집 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을 발견했지만, 올바른 일을한다면 확실하지 않습니다.

답변

2

올바르게 Qt를 사용하려면 QtGui.QApplication 또는 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 메서드를 재정의 할 수 있습니다.

+0

나는이 질문을 간단하게하려고 애썼고, 앱에서 그것을 꺼내는 것이 그것을 깨뜨렸다는 것을 깨달았다. 구현 문제를 해결하기 위해 내 질문을 업데이트했습니다. 그걸 도울 수 있니? – user1938107

+0

myTimer를 전역 범위로 정의 해 주셔서 감사합니다. 아픈 것은 아마 나중에 약간의 질문을 할 필요가있다. 그러나 이것은 내가 지금 거의 도움이되었다! – user1938107

관련 문제