Python 从dict恢复Pyside复选框状态
首先,我对Python非常陌生——这是我编程的第二个月(使用PySide/SQLAlchemy只需几周),所以请温柔一点 我正在开发一个植物管理应用程序,有一个表格,上面有一堆复选框,这些复选框与一年中可以播种的月份有关,还有一堆复选框代表播种区。 我与QTDesigner一起开发了表单 我收集复选框的对象名和状态,并将它们存储在字典中(使用复选框对象名作为键,使用checkstate(true或fals)作为项),然后通过sqlalchemy将其存储在sqlite数据库中(使用PickleType作为列) 我想从sqlite数据库中读取一条记录,并将所有复选框恢复到保存时的状态 我的问题是dict(复选框对象名)中的键是字符串。我不知道如何将此映射到复选框 例如,dict的外观如下:Python 从dict恢复Pyside复选框状态,python,dictionary,pyside,Python,Dictionary,Pyside,首先,我对Python非常陌生——这是我编程的第二个月(使用PySide/SQLAlchemy只需几周),所以请温柔一点 我正在开发一个植物管理应用程序,有一个表格,上面有一堆复选框,这些复选框与一年中可以播种的月份有关,还有一堆复选框代表播种区。 我与QTDesigner一起开发了表单 我收集复选框的对象名和状态,并将它们存储在字典中(使用复选框对象名作为键,使用checkstate(true或fals)作为项),然后通过sqlalchemy将其存储在sqlite数据库中(使用PickleTy
{'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)
我不太了解您的代码,无法判断这些方法中的哪一种更适合您,但我希望它们能为您指明正确的方向,让您找到可行的方法。太棒了!我尝试了您的两种方法,它们都奏效了。非常感谢,我真的很坚持这一点。