Python lambda i=i:foo(i)在for循环中不工作
。它是关于Python lambda i=i:foo(i)在for循环中不工作,python,lambda,pyqt,Python,Lambda,Pyqt,。它是关于lambda x=x:foo(x)捕捉x,即使在for循环中也是如此 这是一个带有标签的窗口,在for循环中生成了两个按钮。单击按钮时,其名称将显示在标签中 如果我们使用通常的lambda:label.setText(“按钮--”+str(i)),那么结果就是循环中的最后一个i,无论按下哪个按钮: 这是对的 当我们更改为lambda i=i:label.setText(“按钮--”+str(i))(snipet)并期望现在一切正常时,结果是: 假的 此False从何而来 impor
lambda x=x:foo(x)
捕捉x,即使在for
循环中也是如此
这是一个带有标签的窗口,在for
循环中生成了两个按钮。单击按钮时,其名称将显示在标签中
如果我们使用通常的lambda:label.setText(“按钮--”+str(i))
,那么结果就是循环中的最后一个i
,无论按下哪个按钮:这是对的 当我们更改为
lambda i=i:label.setText(“按钮--”+str(i))
(snipet)并期望现在一切正常时,结果是:假的 此
False
从何而来
import sys
from PyQt4.QtGui import *
class MainWindow(QWidget):
def __init__(self, parent=None):
QWidget.__init__(self, parent)
vbox = QVBoxLayout(self)
# label for action
label = QLabel('')
vbox.addWidget(label)
# adding buttons
for i in range (1, 3):
btn = QPushButton(str(i))
btn.clicked.connect( lambda i=i: label.setText("button " + str(i)) )
vbox.addWidget(btn)
app = QApplication(sys.argv)
myapp = MainWindow()
myapp.show()
sys.exit(app.exec_())
为什么这个解决方案没有按应有的方式工作?这个false
是什么意思
我知道您可以像在第一个链接中一样使
foo_工厂
,但问题是lambda I=I:foo(I)
我没有安装PyQt4来测试,但我似乎很清楚,当调用lambda回调时,会给它一个参数<然后,code>i等于任何参数,而不是默认值。试试这个,告诉我它是否有效(或者它是否至少改变了输出):
信号“clicked”将布尔参数传递给连接的lambda插槽。您想要完成的事情最好通过以下方式完成:
btn.clicked.connect( lambda clicked, i=i : label.setText("button " + str(i)) )
它从这里开始-@Qiao,顺便说一句——有些人可能主张使用
作为丢弃变量的名称。我不会就此表态,只是说这是一个公认的惯例。好的,明白了。但还有一个更小的问题困扰着我——谁(以及何时)为这个lambda添加了争论。是PyQt里的某个人。但这是另一个问题。@Qiao,我不太了解PyQt,但GUI库在事件触发回调时,通常会将该事件传递给回调。我猜类似的事情正在发生。为什么转换为字符串时显示为“False”对我来说是一个谜。@乔,请参阅,以获得更全面的解释。啊,感谢&+1的链接--我做了一次半心半意的文档搜索,但没有找到我要找的内容。
btn.clicked.connect( lambda clicked, i=i : label.setText("button " + str(i)) )