Я написал клиент-серверное приложение pyQt. (python: 3.2.2, pyQT: 4.8.6)
Отправитель отправляет сообщение прослушивающим получателям, а получатели отправляют ответ отправителю. Я не хочу, чтобы ответ был отправлен мгновенно, но после небольшой задержки.
Это часть кода получателя:
----------------------------- msghandler.py-----------------------------------
class MsgHandler(QObject):
def __init__(self):
QObject.__init__(self)
self.mSec1Timer = None
def setParentUI(self, p):
self.parentUI = p
def handle_ask(self, ID, stamp, length, cargo, peerSocket):
print("Incoming:ASK")
#self.mSec1Timer.timeout.connect(lambda:self.send_msg_reply(peerSocket))
self.mSec1Timer.timeout.connect(self.dummyFunc) #Works
self.mSec1Timer.timeout.connect(lambda:self.dummyFunc())#See Rem-1
self.mSec1Timer.timeout.connect(lambda:self.shouldGiveError())#See Rem-2
self.parentUI.timerStart.emit(5)
@pyqtSlot(tuple)
def send_msg_reply(self, peerSocket):
print("This is not printed")
self.mSec1Timer.timeout.disconnect()
@pyqtSlot()
def dummyFunc(self):
print("dummy @ ",QDateTime.currentMSecsSinceEpoch())
self.mSec1Timer.timeout.disconnect()
------------------------------------------------------------------------------
from msghandler import *
class DialogUIAgent(QDialog):
timerStart = pyqtSignal(int)
def __init__(self):
QDialog.__init__(self)
self.myHandler = MsgHandler()
self.myHandler.setParentUI(self)
self.myTimer = QTimer()
self.myTimer.setSingleShot(True)
self.myHandler.mSec1Timer = self.myTimer
self.timerStart.connect(self.startMyTimer)
@pyqtSlot(int)
def startMyTimer(self, msec):
self.myTimer.start(msec)
Для тестирования поведения сначала я использовал self.mSec1Timer.timeout.connect(self.dummyFunc)
, и результат был таким, как ожидалось:
Incoming:ASK
dummy @ 1322491256315
Incoming:ASK
dummy @ 1322491260310
Incoming:ASK
dummy @ 1322491265319
Incoming:ASK
dummy @ 1322491270323
Incoming:ASK
dummy @ 1322491275331
Но когда я использовал self.mSec1Timer.timeout.connect(lambda:self.send_msg_reply(peerSocket))
, слот никогда не вызывался. Выход:
Incoming:ASK
Incoming:ASK
Incoming:ASK
Incoming:ASK
Почему это происходит, и что я могу сделать, чтобы это исправить?
Заранее спасибо.
РЕДАКТИРОВАТЬ:
Примечание-1:
До этого работал dummyFunc, но он не работает с
lambda:self.dummyFunc()
Примечание-2:
Я ожидал ошибку с lambda:self.shouldGiveError()
, потому что нет такой функции, но вместо этого я ничего не получаю.
Это проблема того, как я использую лямбду?