我有一个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!")
答案 0 :(得分: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))
第一个参数_
对应于self
的{{1}}参数。