lambda i = i:for循环中的fooi不起作用

问题描述

|| 首先阅读。即使在
for
循环中,x也大约ѭ0x捕捉到x。 这是一个带有标签和window1ѭ循环中生成的两个按钮的窗口。单击按钮时,其名称显示标签中。 如果我们使用常规的
lambda: label.setText(\"button -- \" + str(i))
,那么无论按下什么按钮,结果都是循环中的最后last4ѭ: 这是对的。 当我们更改为
lambda i=i: label.setText(\"button -- \" + 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_factory
,但是问题是
lambda i=i: foo(i)
有什么问题     

解决方法

        我目前没有安装PyQt4进行测试,但是对我来说似乎很清楚,当调用您的lambda回调时,会得到一个参数。
i
等于参数,而不是默认值。尝试此操作,并告诉我它是否有效(或至少它会更改输出):
btn.clicked.connect( lambda throw_away=0,i=i: label.setText(\"button \" + str(i)) )
    ,        信号\“ clicked \\”将布尔参数传递给所连接的Lambda插槽。 文献资料 您可以尝试通过以下方式更好地实现目标:
btn.clicked.connect( lambda clicked,i=i : label.setText(\"button \" + str(i)) )