我在pyqt中有一个带有以下按钮的python程序:
this=[1,k]
button.clicked.connect(lambda x=this:self.testFunction(str(x)))
当我按下按钮时,我得testFunction(False)
而不是testFunction(str([1,k]))
。有什么想法吗?提前谢谢。
答案 0 :(得分:4)
原因是你错误地解释了lambda
的工作原理。 Lambda返回一个匿名函数,其中包含您给出的定义。通过说lambda x=this:
,如果对此函数的调用没有x
参数,则默认使用此参数。
观察:
l = lambda x=3: x*2
print l(10) # Prints 20
print l() # Prints 6
如果我们查看QPushButton.clicked()
(inherited from QAbstractButton)的文档,我们会看到它使用布尔参数触发。
所以在这一行:
button.clicked.connect(lambda x=this:self.testFunction(str(x)))
lambda函数总是传递一个参数,该参数从QPushButton.clicked()
传递,并且可以是True
或False
。因此,永远不会使用默认值this
。作为替代方案,您可以使用:
button.clicked.connect(lambda x:self.testFunction(str(this)))
但这可能不是你想要的,因为它总会将数组的字符串变量传递给函数。另一方面,这个:
button.clicked.connect(lambda x:self.testFunction(str(this[x])))
将根据传递的参数是1
还是k
来传递其True
或False
的字符串转换。