循环连接 PyQt4 中的槽和信号:打破绑定链
在本文中,我们解决了连接时遇到的常见问题来自 PyQt4 循环内创建的按钮的 clicked() 信号。我们的目标是理解为什么所有按钮都会打印出相同的值,尽管我们期望每个按钮都应该根据其标签触发唯一的操作。
理解范围和闭包
在提供的示例中观察到的行为是 Python 的作用域和闭包机制的结果。在循环内创建按钮时,我们尝试将其 clicked() 信号连接到 lambda 函数。然而,Python 仅通过函数的赋值或参数列表在命名空间中引入新的绑定。
因此,lambda 函数没有自己的循环变量 i 的绑定,而是在封闭函数 __init__()。在执行 lambda 时,i 已被分配其最终值 9,导致所有按钮打印出相同的输出。
解决方案
要解决这个问题,我们可以将 i 作为带有默认值的关键字参数传递给 lambda 函数。这确保了 lambda 中的 i 独立于 __init__() 中的 i。或者,我们可以使用 functools.partial 函数,它提供了一种更具可读性且不那么“神奇”的方法来实现相同的结果。
带有关键字参数的示例:
self._numberButtons[i].clicked.connect(lambda checked, i=i: self._number(i))
functools.partial 示例:
self._numberButtons[i].clicked.connect(partial(self._number, i))
通过实现其中一种方法,我们可以成功地在每个按钮及其各自的操作之间建立所需的绑定。
以上是为什么我的 PyQt4 按钮在循环连接时都打印相同的值?的详细内容。更多信息请关注PHP中文网其他相关文章!