首页 >后端开发 >Python教程 >如何在 PyQt4 中动态连接槽和信号而不会出现意外行为?

如何在 PyQt4 中动态连接槽和信号而不会出现意外行为?

DDD
DDD原创
2024-11-11 19:50:03848浏览

How to Connect Slots and Signals Dynamically in PyQt4 Without Unexpected Behavior?

在 PyQt4 中动态连接槽和信号

在 PyQt4 中,以编程方式将多个槽连接到信号在循环内完成时可能会导致意外行为.

问题:

考虑创建一个带有循环内动态生成的数字按钮的计算器。如果每个按钮的'clicked()'信号连接如下:

def __init__(self):
    for i in range(0, 10):
        self._numberButtons += [QPushButton(str(i), self)]
        self.connect(self._numberButtons[i], SIGNAL('clicked()'), lambda : self._number(i))

问题:

当任何一个按钮被点击时,它们都会打印'9 '。这种行为源于 Python 的作用域和闭包语义。 lambda 表达式引用变量 i,该变量在循环内计算为最终值“9”。

解决方案:

要避免此问题,请传递 i作为具有默认值的关键字参数:

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

或者,使用 functools.partial 以获得更简洁的方法:

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

这些解决方案将 lambda 表达式中的 i 隔离,确保每个单击按钮时会触发其预期操作。

以上是如何在 PyQt4 中动态连接槽和信号而不会出现意外行为?的详细内容。更多信息请关注PHP中文网其他相关文章!

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