在循环中为PyQt5信号创建lambda函数吗?

时间:2018-12-12 20:48:03

标签: python python-3.x loops lambda pyqt5

我试图将一个函数连接到在循环内创建的按钮,每个按钮的函数使用不同的参数。这是我的尝试:

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()

0 个答案:

没有答案