Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python lambda i=i:foo(i)在for循环中不工作_Python_Lambda_Pyqt - Fatal编程技术网

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)) )