首页 >后端开发 >Python教程 >为什么我的所有计算器按钮在 PyQt4 中循环连接时打印相同的数字?

为什么我的所有计算器按钮在 PyQt4 中循环连接时打印相同的数字?

Linda Hamilton
Linda Hamilton原创
2024-11-13 02:22:02497浏览

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

循环连接 PyQt4 插槽和信号:排除意外结果

在 PyQt4 中构建计算器时,连接按钮 'clicked()'循环内的信号可能会导致意外的行为。出现此问题的原因是单击按钮时未打印预期的数字。相反,所有按钮都会打印相同的数字。

理解问题

Python 的作用域规则在这种情况下创建了一个闭包。循环变量“i”用作每个按钮的 lambda 函数的参数。但是,Python 在封闭函数 (__init__()) 的命名空间中解析“i”。由于 'i' 在循环中被修改并最终被赋值为 9,所以所有按钮都引用同一个闭包,因此无论单击哪个按钮,它们都输出 '9'。

解决问题

要解决此问题,我们可以将“i”作为具有默认值的关键字参数传递。这在 lambda 函数的命名空间中引入了“i”的新绑定,使其独立于 __init__() 中的“i”。

使用关键字参数的解决方案:

self._numberButtons[i].clicked.connect(lambda checked, i=i: self._number(i))

使用 functools.partial 的解决方案:

另一种方法是使用 functools.partial,它创建带有预绑定参数的部分函数。这使代码更具可读性,并消除了关键字参数的使用。

self._numberButtons[i].clicked.connect(partial(self._number, i))

通过实施这些解决方案,每个按钮在单击时都会打印预期的数字。

以上是为什么我的所有计算器按钮在 PyQt4 中循环连接时打印相同的数字?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn