【发布时间】:2012-01-08 02:20:06
【问题描述】:
我编写了一个 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
为什么会发生这种情况,我能做些什么来解决它?
提前致谢。
编辑:
备注一:
dummyFunc 以前工作过,但它不适用于
lambda:self.dummyFunc()
备注 2:
我期待lambda:self.shouldGiveError() 出现错误,因为没有这样的功能,但我什么也没得到。
这是我使用 lambda 方式的问题吗?
【问题讨论】:
-
在我看来,您的示例不起作用,因为第一次调用 dummyFunc 会断开信号?
标签: python qt python-3.x pyqt pyqt4