【问题标题】:QPushButton keeps running function with the same value [duplicate]QPushButton 以相同的值保持运行功能[重复]
【发布时间】:2020-04-30 01:25:29
【问题描述】:

我有一本 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!")

【问题讨论】:

  • self.buttons[x].clicked.connect(lambda: self.ButtonPressed(x))更改为self.buttons[x].clicked.connect(lambda _, x=x: self.ButtonPressed(x))

标签: python pyqt pyqt5


【解决方案1】:

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

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

您所要做的就是使用本地参数屏蔽 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))

第一个参数_对应ButtonPressedself参数。

【讨论】:

    猜你喜欢
    • 2020-02-23
    • 1970-01-01
    • 1970-01-01
    • 2021-02-25
    • 1970-01-01
    • 1970-01-01
    • 2019-10-28
    • 2018-02-08
    • 1970-01-01
    相关资源
    最近更新 更多