我有一个简单的示例PyQt5
程序,下面该程序在循环中创建两个QPushButtons
,一个用于列表[ "foo", "bar" ]
它将clicked
插槽设置为lambda,以显示当前列表值。
应该在用户点击"foo"
按钮时打印foo
,并在用户点击"bar"
按钮时带上bar
。 / p>
但是,当点击其中一个时,它会打印"bar"
。
#!/usr/bin/env python3
import sys
import subprocess
from PyQt5 import QtCore, QtWidgets
class App(QtWidgets.QWidget):
def __init__(self):
super().__init__()
layout = QtWidgets.QVBoxLayout()
self.setLayout(layout)
for i in [ 'foo', 'bar' ]:
btn = QtWidgets.QPushButton(i)
btn.clicked.connect(lambda: print(i)) # print "foo" or "bar"
layout.addWidget(btn)
qapp = QtWidgets.QApplication(sys.argv)
app = App()
app.show()
sys.exit(qapp.exec_())
我遇到的问题(我想)是在循环的每次迭代中都重新分配i
的值,因此,当用户单击"foo"
按钮时,lambda具有一个对i
的引用,随后将其设置为"bar"
。
这样,每次用户单击按钮时,两者 foo
和bar
都会打印bar
。
我尝试使用copy.copy(i)
和copy.deepcopy(i)
:
for i in [ 'foo', 'bar' ]:
i = copy.deepcopy(i)
btn = QtWidgets.QPushButton(i)
btn.clicked.connect(lambda: print(i))
layout.addWidget(btn)
不幸的是,这没有效果。
问题:
如何获取i
的副本以用于我的广告位/ lambda,以便循环的后续迭代不会更改所有先前迭代中的值?>