2015-09-02 10 views
6

Mi dispiace per la domanda, ma ho letto un sacco di cose e sembra che non capisco come fare un timer. Quindi sto postando il mio codice:PyQt4 - creazione di un timer

from PyQt4 import QtGui, QtCore 
from code.pair import Pair 
from code.breadth_first_search import breadth_first_search 
import functools 


class Ghosts(QtGui.QGraphicsPixmapItem): 

    def __init__(self, name): 
     super(Ghosts, self).__init__() 

     self.set_image(name) 

    def chase(self, goal): 
     pos = Pair(self.x(), self.y()) 
     path = breadth_first_search(pos, goal) 
     while not path.empty(): 
      aim = path.get_nowait() 
      func = functools.partial(self.move_towards, aim) 
      timer = QtCore.QTimer() 
      QtCore.QTimer.connect(timer, QtCore.SIGNAL("timeout()"), self, QtCore.SLOT("func()")) 
      timer.start(200) 

    def move_towards(self, goal): 
     self.setPos(goal.first(), goal.second()) 

Sto provando a spostare l'oggetto verso il suo obiettivo ogni 200ms. Ho provato senza di sé mi dà gli stessi errori:

QObject.connect(QObject, SIGNAL(), QObject, SLOT(), Qt.ConnectionType=Qt.AutoConnection): argument 3 has unexpected type 'bytes' 
QObject.connect(QObject, SIGNAL(), callable, Qt.ConnectionType=Qt.AutoConnection): argument 3 has unexpected type 'bytes' 
QObject.connect(QObject, SIGNAL(), SLOT(), Qt.ConnectionType=Qt.AutoConnection): argument 2 has unexpected type 'bytes' 

non ho idea di come collegare il timer a una funzione con argomenti. Ho pensato che non sto usando l'argomento SLOT a destra ma mi ha dato quei mystakes. Suppongo che sia tutto sbagliato. Gradirei un po 'di aiuto:)

risposta

10

Utilizzare nuovi segnali di stile, sono più facili da capire.

Swap -

QtCore.QTimer.connect(timer, QtCore.SIGNAL("timeout()"), self, QtCore.SLOT("func()")) 

Con -

timer.timeout.connect(self.move_towards) # assuming that move_towards is the handler 

Un semplice ma pieno esempio di un timer di lavoro -

import sys 

from PyQt4.QtCore import QTimer 
from PyQt4.QtGui import QApplication 

app = QApplication(sys.argv) 
app.setQuitOnLastWindowClosed(False) 

def tick(): 
    print 'tick' 

timer = QTimer() 
timer.timeout.connect(tick) 
timer.start(1000) 

# run event loop so python doesn't exit 
app.exec_() 
+0

ho provato, ma non ha nemmeno entrare in move_towards, poi ho provato con 'timer.timeout.connect (func)' ma non ha funzionato neanche. Quando ho provato 'QtCore.QTimer.singleShot (200, func)' funziona ma fa una mossa e poi si ferma. – vixenn

+1

Modificato per contenere un esempio completo –

+1

Se non funziona per voi quindi è necessario assicurarsi che il riferimento al timer memorizzato non sia garbage collector e anche passare un widget come genitore al timer che dovrebbe impedire la garbage collection prematura quando si esce dall'ambito. – kmcguire