我试图将一个函数连接到在循环内创建的按钮,每个按钮的函数使用不同的参数。这是我的尝试:
from PyQt5 import QtWidgets, QtGui, QtCore
class GUI(QtWidgets.QWidget):
def __init__(self):
super().__init__()
layout = QtWidgets.QVBoxLayout()
self.setLayout(layout)
self.show()
for num in range(5):
b = QtWidgets.QPushButton(str(num))
string = f"You clicked button {num}!"
b.clicked.connect(lambda x=string: self.func(x))
layout.addWidget(b)
def func(self, thing):
print(thing)
app = QtWidgets.QApplication([])
win = GUI()
app.exec_()
这将创建具有5个按钮的GUI,但是单击它们只会在控制台上显示“ False”。
最初,我有connect(lambda: self.func(string))
,这导致每个按钮打印You clicked button 4!
,因为:
https://docs.python.org/3/faq/programming.html#why-do-lambdas-defined-in-a-loop-with-different-values-all-return-the-same-result
但是我不知道为什么现在传递False。我尝试在PyQt外部使用如下相同的功能和逻辑,并成功将0 1 2 3 4打印到控制台。
func_list = []
for num in range(5):
func_list.append(lambda x=num: func(x))
def func(thing):
print(thing)
for f in func_list:
f()