PyQt4 - создание таймера

Прошу прощения за вопрос, но я прочитал кучу вещей, и кажется, что я не понимаю, как сделать таймер. Поэтому я отправляю свой код:

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())

Я пытаюсь сделать объект движением к своей цели каждые 200 мс. Я пробовал без себя, он дает мне те же ошибки:

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'

Я понятия не имею, как подключить таймер к функции с аргументами. Я думал, что я не использую аргумент SLOT правильно, но он дал мне эти загадки. Я полагаю, что все это неправильно. Я был бы признателен за помощь:)

1 ответ

Используйте новые сигналы стиля, их легче понять.

Swap -

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

С -

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

Простой, но полный пример рабочего таймера -

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_()

licensed under cc by-sa 3.0 with attribution.