PyQt5在插槽

时间:2019-02-22 20:22:57

标签: python pyqt

我有一个简单的示例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"

这样,每次用户单击按钮时,两者 foobar都会打印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,以便循环的后续迭代不会更改所有先前迭代中的值?

0 个答案:

没有答案