2

我在 pyqt 中有一个带有以下按钮的 python 程序:

this=[1,k]   
button.clicked.connect(lambda x=this:self.testFunction(str(x)))

当我按下按钮时,我得到了testFunction(False)宁愿testFunction(str([1,k]))。任何想法为什么?提前致谢。

4

1 回答 1

6

原因是您误解了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()并且将是Trueor False。因此,this从不使用默认值 of。作为替代方案,您可以使用:

button.clicked.connect(lambda x:self.testFunction(str(this)))

但这可能不是您想要的,因为它总是将数组 this 的字符串变体传递给函数。另一方面是:

button.clicked.connect(lambda x:self.testFunction(str(this[x])))

将传递他们的字符串转换1ork取决于传递的参数是Trueor False

于 2013-09-18T02:11:09.117 回答