如何解决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)) )
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。