【问题标题】:PySide2 Lambda Binding Issue [duplicate]PySide2 Lambda绑定问题[重复]
【发布时间】:2020-10-15 06:12:54
【问题描述】:

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

checked = []

cb1 = QCheckBox('1')
cb2 = QCheckBox('2')
cb3 = QCheckBox('3')

cbs = [cb1, cb2, cb3]

for n, cb in enumerate(cbs):
    cb.stateChanged.connect(lambda: checked.append(n) if cb.isChecked() else checked.remove(n))

我发现这里的问题在于 python 的common gotchas 中描述的“后期绑定”。每当激活复选框时,n 的值始终为 2。但是,我尝试使用文档中的以下解决方案也失败了。

for n, cb in enumerate(cbs):
    cb.stateChanged.connect(lambda n=n: checked.append(n) if cb.isChecked() else checked.remove(n))
for n, cb in enumerate(cbs):
    cb.stateChanged.connect(lambda n=n, button=button: checked.append(n) if cb.isChecked() else checked.remove(n))

第一个解决方案给出了看似随机且不正确的 n 值,而第二个解决方案以某种方式将按钮变量转换为整数。在只有几个复选框的情况下,我会考虑逐个设置这些功能,但在实际应用中需要大约 20 个复选框。对此的任何见解将不胜感激!

【问题讨论】:

    标签: python checkbox lambda binding pyside2


    【解决方案1】:

    试试看:

    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_())  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-25
      • 1970-01-01
      • 1970-01-01
      • 2021-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多