Python PySide2 Lambda绑定问题

Python PySide2 Lambda绑定问题,python,checkbox,lambda,binding,pyside2,Python,Checkbox,Lambda,Binding,Pyside2,我正在PySide2应用程序中开发一个(相当基本的)功能。该应用程序包含一个复选框列表,当选中复选框时,我需要将复选框的索引附加到列表中。下面可以看到我在这方面的失败尝试 checked=[] cb1=QCheckBox('1') cb2=QCheckBox('2') cb3=QCheckBox('3') cbs=[cb1,cb2,cb3] 对于n,枚举中的cb(cbs): cb.stateChanged.connect(lambda:checked.append(n),如果cb.isCheck

我正在PySide2应用程序中开发一个(相当基本的)功能。该应用程序包含一个复选框列表,当选中复选框时,我需要将复选框的索引附加到列表中。下面可以看到我在这方面的失败尝试

checked=[]
cb1=QCheckBox('1')
cb2=QCheckBox('2')
cb3=QCheckBox('3')
cbs=[cb1,cb2,cb3]
对于n,枚举中的cb(cbs):
cb.stateChanged.connect(lambda:checked.append(n),如果cb.isChecked()已选中,则追加(n),否则删除(n))
我发现,这里的问题在于python中描述的“后期绑定”。每当复选框被激活时,n的值始终为2。但是,我尝试使用文档中的以下解决方案,但也失败了

对于枚举中的n,cb(cbs):
cb.stateChanged.connect(lambda n=n:checked.append(n),如果cb.isChecked()已选中,则追加(n),否则删除(n))
对于枚举中的n,cb(cbs):
cb.stateChanged.connect(lambda n=n,button=button:checked.append(n)(如果cb.isChecked()),否则选中。删除(n))
第一个解决方案为n提供了看似随机且不正确的值,第二个解决方案以某种方式将button变量转换为整数。在只有几个复选框的情况下,我会考虑逐个设置这些函数,但在实际应用程序中,需要有大约20个复选框。对此有任何见解都将不胜感激

试试看:

class Demo(QWidget):
    def __init__(self):
        super().__init__()

        self._checked = []

        self.cb1 = QCheckBox('1')
        self.cb2 = QCheckBox('2')
        self.cb3 = QCheckBox('3')
        
        layout = QVBoxLayout(self)
        layout.addWidget(self.cb1)
        layout.addWidget(self.cb2)
        layout.addWidget(self.cb3)

        cbs = [self.cb1, self.cb2, self.cb3]
        for n, cb in enumerate(cbs):
            cb.stateChanged.connect(lambda state, n=n+1: self.list_checked(state, n))
            
    def list_checked(self, state, n):
        if state:
            self._checked.append(n)
        else:
            self._checked.remove(n)
        print(self._checked)

   
if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    wform = Demo()
    wform.resize(200, 100)
    wform.show()
    sys.exit(app.exec_())