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