QPushButton使运行函数具有相同的值

问题描述 投票:0回答:1

我有一个QPushButtons字典,我试图在按下某个按钮时更改文本,但是它只会更改最后一个按钮。我认为问题在于,每当3通过时,我都不知道为什么会这样。我的代码如下:

class App(QWidget):
    def __init__(self):
        super().__init__()

        self.buttons = {}

        for x in range(1, 4):
            self.buttons[x] = QPushButton(self)
            self.buttons[x].setText("TestButton")
            self.buttons[x].resize(70, 30)
            self.buttons[x].move(40, 40*x)
            self.buttons[x].clicked.connect(lambda: self.ButtonPressed(x))

        self.show()

    def ButtonPressed(self, x):
        self.buttons[x].setText("Text Changed!")
python pyqt pyqt5
1个回答
0
投票

lambda中的变量x引用了循环中的x。因此,它的值将在每次迭代后更改(并在循环结束时获取最后一个值)。您可以看到,如果您在ButtonPressed中打印x的地址:

    def ButtonPressed(self, x):
        self.buttons[x].setText("Text Changed!")
        print(hex(id(x)), x)

您要做的就是使用局部参数mask x。您可以使用functools中的partial

fct = partial(self.ButtonPressed, x=x)
self.buttons[x].clicked.connect(fct)

或者您也可以在lambda中添加参数:

self.buttons[x].clicked.connect(lambda _, local_x=x: self.ButtonPressed(local_x))

[第一个参数_对应于selfButtonPressed参数。

© www.soinside.com 2019 - 2024. All rights reserved.