pyqt4中的按钮最终具有相同的事件处理程序,即使它们不应该

时间:2016-03-26 01:58:13

标签: python pyqt4

commands数组包含一个元组列表,每个元组包含一个名称和将处理事件的函数。对于每对,创建一个新按钮并将其添加到QListWidget。 问题是所有按钮最终调用相同的处理函数。列表中的最后一个。我已经使用我的调试器进行了检查,并且它通过列表正确循环,并且每个循环都传递了正确的处理函数。

这是生成按钮的功能。

def load_commands(self):
    for name, handler in commands:
        btn = QtGui.QPushButton(name)
        btn.clicked.connect(lambda: handler(self))
        item = QtGui.QListWidgetItem()
        item.setSizeHint(Qt.QSize(0, 30))
        self.list_commads.addItem(item)
        self.list_commads.setItemWidget(item, btn)

[编辑]在每个循环结束时尝试将btn和item设置为None。它不起作用。

1 个答案:

答案 0 :(得分:1)

您需要保留对每个处理程序的引用,否则只有最后一个将留在范围内。一种方法是使用默认参数:

    btn.clicked.connect(lambda *args, handler=handler: handler(self))

请注意,clicked始终会发送按钮的已检查状态,因此*args可以避免破坏默认参数。