为什么我的 PyQt4 按钮在循环连接时都打印相同的值?

Mary-Kate Olsen
发布: 2024-11-11 17:22:03
原创
526 人浏览过

Why Do My PyQt4 Buttons All Print the Same Value When Connected in a Loop?

循环连接 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板