Python 从dict恢复Pyside复选框状态

Python 从dict恢复Pyside复选框状态,python,dictionary,pyside,Python,Dictionary,Pyside,首先,我对Python非常陌生——这是我编程的第二个月(使用PySide/SQLAlchemy只需几周),所以请温柔一点 我正在开发一个植物管理应用程序,有一个表格,上面有一堆复选框,这些复选框与一年中可以播种的月份有关,还有一堆复选框代表播种区。 我与QTDesigner一起开发了表单 我收集复选框的对象名和状态,并将它们存储在字典中(使用复选框对象名作为键,使用checkstate(true或fals)作为项),然后通过sqlalchemy将其存储在sqlite数据库中(使用PickleTy

首先,我对Python非常陌生——这是我编程的第二个月(使用PySide/SQLAlchemy只需几周),所以请温柔一点

我正在开发一个植物管理应用程序,有一个表格,上面有一堆复选框,这些复选框与一年中可以播种的月份有关,还有一堆复选框代表播种区。 我与QTDesigner一起开发了表单

我收集复选框的对象名和状态,并将它们存储在字典中(使用复选框对象名作为键,使用checkstate(true或fals)作为项),然后通过sqlalchemy将其存储在sqlite数据库中(使用PickleType作为列)

我想从sqlite数据库中读取一条记录,并将所有复选框恢复到保存时的状态

我的问题是dict(复选框对象名)中的键是字符串。我不知道如何将此映射到复选框

例如,dict的外观如下:

{'zone5bCB':True,'zone3aCB':False,'zone7bCB':True,'zone1CB':True,'zone3bCB':False,'zone9aCB':False,'zone6aCB':False,'zone10aCB':False,'zone10bCB':False,'zone11CB':True,'zone2aCB':False,'zone8aCB':False,'zone4bCB':True,'zone9bCB':True,'zone7aCB':False,“zone5aCB”:True}

其中键是对象名。 因此,如果我想使用dict中的第一个键:item执行此操作:

self.zone5bCB.setCheckState(QtCore.Qt.Checked)

我有一种感觉,我必须做一个findchildren()将它们与dict中的对象名称进行匹配。或者我可能完全用错了方法,我应该用另一种方法在数据库中存储/恢复复选框状态

下面是我刚刚展示的GUI类中相关方法的精简版本:

def getCBState(self, wid):
    """ gets the state of all checkboxes on widget wid"""
    returndict = dict()
    CBs = wid.children()
    for box in CBs:
        if(isinstance(box, QtGui.QCheckBox)):
            returndict[box.objectname()] = box.isChecked()
    return returndict

def saveRecord(self):
    """ reads data from all editable widgets and saves to db"""
    # read checkboxes and store in dict's
    zonesdict = self.getCBState(self.layoutWidget2)
    sowseasondict = self.getCBState(self.layoutWidget7)          
    session = Session()
    newplant = PlantInfo(refname=self.refNameEdit.text(), 
                        botname = self.botNameEdit.text(),
                        zones = zonesdict,
                        sowseason = sowseasondict #saving dicts as Blobs
                        #lots more stuff is here but cut for this
                        )

def populateCBs(self, instance): 
    print(instance)
    if instance:
        for key, item in instance.items():
            if item:
                key.setCheckState(QtCore.Qt.Checked) #<-- doesn't work because key is string not a QCheckbox object

def displayDetails(self, current_id=0):
    """ Display records inthe detailed form"""
    session = Session()

    for instance in session.query(PlantInfo).filter(PlantInfo.id == current_id):
        self.clearAll()
        #populate gen info tab
        self.plantIdDisplay.setText(str(instance.id))
        self.plantNameHeader.setText(instance.botname)
        self.refNameEdit.setText(instance.refname)
        self.botNameEdit.setText(instance.botname)

        self.populateCBs(instance.zones)
        self.populateCBs(instance.sowseason)
def getCBState(self,wid):
“”“获取小部件wid上所有复选框的状态”“”
returndict=dict()
CBs=wid.children()
对于CBs中的box:
如果(isinstance(框,QtGui.QCheckBox)):
returndict[box.objectname()]=box.isChecked()
返回命令
def保存记录(自我):
“”“从所有可编辑小部件读取数据并保存到数据库”“”
#阅读复选框并存储在dict中
zonesdict=self.getCBState(self.layoutWidget2)
SOWS季节性dict=self.getCBState(self.layoutWidget7)
会话=会话()
newplant=PlantInfo(refname=self.refnamedit.text(),
botname=self.botnamedit.text(),
分区=分区域,
sowseason=sowseasondict#将dict保存为blob
#还有很多东西在这里,但是为了这个
)
def populateCBs(自身、实例):
打印(实例)
例如:
对于键,instance.items()中的项:
如果项目:

key.setCheckState(QtCore.Qt.Checked)#我对PySide或GUI代码一般不太了解,但我认为我可以看到两种可能对您有意义的方法:

第一种方法是创建一个与当前
getCBStates
方法完全相反的方法:

def setCBState(self, wid, statedict):
    """ sets the state of all checkboxes on widget wid"""
    CBs = wid.children()
    for box in CBs:
        if isinstance(box, QtGui.QCheckBox) and statedict[box.objectname()]:
            box.setCheckState(QtCore.Qt.Checked)
我的另一个想法是基于当前的
populateCBs
方法,它假设字典中的对象名称对应于当前对象上的属性。它使用
getattr
函数访问属性:

def populateCBs(self, instance): 
    print(instance)
    if instance:
        for key, item in instance.items():
            if item:
                getattr(self, key).setCheckState(QtCore.Qt.Checked)

我不太了解您的代码,无法判断这些方法中的哪一种更适合您,但我希望它们能为您指明正确的方向,让您找到可行的方法。

太棒了!我尝试了您的两种方法,它们都奏效了。非常感谢,我真的很坚持这一点。