python - QPushButton 以相同的值保持运行功能
问题描述
我有一本 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!")
解决方案
x
lambda 中的变量引用x
循环中的 。因此,它的值会在每次迭代后发生变化(并且会在循环结束时取最后一个值)。您可以看到,如果您在中打印 x 的地址ButtonPressed
:
def ButtonPressed(self, x):
self.buttons[x].setText("Text Changed!")
print(hex(id(x)), x)
您所要做的就是使用本地参数进行屏蔽。 x
您可以使用partial
from functools:
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
参数ButtonPressed
。
推荐阅读
- python - 如何在实时屏幕上实时覆盖实时更新对象?
- docusignapi - 通过仅发送模板的少量文档在 docusign api 中发送设计请求
- image - PdfSharp 图像过滤器是空字符串
- dart - 可以在不中断导入的情况下重命名本地 Dart 依赖项的“lib”目录吗?
- python - 为什么没有加载静态文件?| 姜戈
- python - Python/sqlalchemy/运行 SQL 后获取列名
- javascript - Looping over objects to add property not working (Javascript with Mongodb)
- sql-server - Get the Difference of two tables along with duplicate records and store in 3rd table in Azure SQL DB
- java - To use an ArrayList or a LinkedList while looping through a JDBC ResultSet
- python - 日志转换-ValueError:无法将浮点 NaN 转换为整数