在 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中文网其他相关文章!