我想在对象列表中执行一个函数,并存储结果。 我在下面的代码中的问题是,尽管我尝试断开所有信号,但functionC仍以某种方式持续触发。 (断开输出False)
class object(...):
def init(self):
...
self.emit(SIGNAL('result(bool)', result)
...
class classA(...):
def functionA(self):
self.results=[]
self.i=0
self.object[...]=... # len(self.object)=n
self.functionB()
def functionB(self):
self.connect(self.object[self.i], SIGNAL('result(bool)'), lambda bool: self.functionC(bool))
self.object[self.i].init()
def functionC(self, result):
print self.disconnect(self.object[self.i], SIGNAL('result(bool)', lambda bool: self.functionC(bool)) # outputs False (why cannot I disconnect it?)
self.i+=1
self.results.append(result)
if self.i==len(self.object):
print "finish"
self.i=0
return
self.functionB()
任何人都能想象出这个问题?感谢
答案 0 :(得分:3)
我不确定您的代码是否仅仅是一个示例,或者您是否真的在为插槽使用lambda函数。如果您确实使用lambda,原因很可能是因为lambda函数在connect和disconnect之间是完全不同的对象:
>>> fn1 = lambda bool: self.functionC(bool)
>>> fn2 = lambda bool: self.functionC(bool)
>>> print fn1, fn2
<function <lambda> at 0x1004a9320> <function <lambda> at 0x1004a9398>
>>> fn1 == fn2
False
>>> fn1 is fn2
False
如果pyqt正在存储函数引用并查找您指定要断开的函数引用,它将报告它未连接。你想要做的是实际引用一个持久的回调。将lambda存储为成员属性并同时引用同一属性,或将其定义为标准方法或函数。