.deleter方法仅在

2024-09-30 20:18:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我在.deleter中遇到问题,我试图删除的值仅在第一次尝试时有效

复制:

  • 选中“GrpB Alice”并点击“单击我”(暂时不要关闭窗口)
  • i.myDict返回{u'GrpB': set([u'Alice'])})正确
  • 选中“GrpB Phan”并点击“点击我”
  • i.myDict返回{u'GrpB': set([u'Alice', 'Phan])})正确
  • 选中“GrpB Alice”并点击“单击我”
  • i.myDict返回{u'GrpB': set([u'Alice', 'Phan])}),这在我期望的地方是不正确的{u'GrpB': set([u'Alice'])})

如果我关闭工具,重新执行最后一步,只有i.myDict返回正确,但如果我第三次检查新选项,i.myDict将再次返回错误的结果

deleter确实被调用了,但它似乎只执行了一次真正的删除。我是不是遗漏了什么

class SubMenuWindow(QtGui.QWidget):
    def __init__(self, menu_items, parent=None, callback=None):
        super(SubMenuWindow, self).__init__(parent)

        self.callback = callback

        self.my_lyt = QtGui.QVBoxLayout()
        self.checked_options = []
        self.sel = defaultdict(set)

        for menu_name, submenu_name in menu_items.items():
            # Set the main menu item name
            self.groupbox = QtGui.QGroupBox(self)
            self.groupbox.setTitle(menu_name)
            self.groupbox.setLayout(QtGui.QVBoxLayout())
            self.my_lyt.addWidget(self.groupbox)

            if submenu_name:
                sub_txt = [action for action in submenu_name]
                for s in sub_txt:
                    sub_chk = QtGui.QCheckBox(s)
                    self.checked_options.append(sub_chk)
                    self.groupbox.layout().addWidget(sub_chk)

        apply_tag_btn = QtGui.QPushButton('Apply to selected item')
        apply_tag_btn.clicked.connect(self.get_checked_options)

        self.my_lyt.addWidget(apply_tag_btn)
        self.my_lyt.addStretch()

        self.setLayout(self.my_lyt)
        self.show()

    def get_checked_options(self):
        for chk in self.checked_options:
            if chk.isChecked():
                print 'Checked - {0}, Parent - {1}'.format(chk.text(), chk.parent().title())
                self.sel[chk.parent().title()].add(chk.text())

        if self.callback:
            self.callback()

class MainWin(QtGui.QWidget):
    def __init__(self, parent=None):
        super(MainWin, self).__init__(parent)

        self.my_dict = {}

        btnA = QtGui.QPushButton('Click Me')
        btnA.clicked.connect(self.get_options)

        btnB = QtGui.QPushButton('Get results')
        btnB.clicked.connect(self.get_results)

        layout = QtGui.QVBoxLayout()
        layout.addWidget(btnA)
        layout.addWidget(btnB)
        self.setLayout(layout)

    def get_options(self):
        sample_dict = {'GrpA' : ['John', 'Zack'], 'GrpB' : ['Alice', 'Phan']}
        self.subWin = SubMenuWindow(sample_dict, callback=self.get_results)


    def get_results(self):
        i = MyDict()

        # delete any existing values
        del (i.myDict)
        # append the new values
        i.myDict = self.subWin.sel

        print 'current myDict values : ', i.myDict

        # If I select 'GrpB - Alice'
        # i.myDict is `{u'GrpB': set([u'Alice'])})`         # correct

        # If I select 'GrpB - Alice' and 'GrpB - Phan'
        # i.myDict is `{u'GrpB': set([u'Alice', 'Phan'])})` # correct

        # If I re-select 'GrpB - Alice'
        # i.myDict is `{u'GrpB': set([u'Alice', 'Phan'])})` # in-correct



class MyDict(QtCore.QObject):
    def __init__(self):
        self._myDict = None

    @property
    def myDict(self):
        return self._myDict

    @myDict.setter
    def myDict(self, value):
        self._myDict = value

    @myDict.deleter
    def myDict(self):
        del(self._myDict)

Tags: nameselfgetmydefcallbackmydictparent