问题描述
||
首先阅读。即使在
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)) )