将 Qtable 中的多条记录保存到 Pickle
Posted
技术标签:
【中文标题】将 Qtable 中的多条记录保存到 Pickle【英文标题】:Saving multiple record from Qtable into Pickle 【发布时间】:2021-05-24 07:26:41 【问题描述】:def save():
file=open("data1.pickle","wb")
pickle.dump(table,file)
file.close()
print("data saved")
我想将表中显示的记录保存到 pickle 文件中,当我单击上传时,所有记录应该再次显示。我该怎么做?请帮忙。
【问题讨论】:
请添加描述当您使用这部分代码时现在发生的情况以及期望的行为。 对不起,我忘记添加描述了。如果您知道答案,请帮助我!非常感谢! 【参考方案1】:您将需要从表格行中获取文本值,并将其存储在dict
中,相对于它们的列标题。然后,您可以使用 pickle 保存 dict
。
请参阅下面的示例以了解如何保存表格
import sys
import pickle, copy
from PyQt5 import QtWidgets
class App(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.setLayout(QtWidgets.QVBoxLayout())
self.btn = QtWidgets.QPushButton("Add new Row", clicked=self.addRow)
self.delete_records = QtWidgets.QPushButton("delete Records", clicked=self.deleteRecords)
self.save_btn = QtWidgets.QPushButton("Save Records", clicked=self.serialize)
self.load_btn = QtWidgets.QPushButton("Upload Records", clicked=self.deserialize)
self.layout().addWidget(self.btn)
self.layout().addWidget(self.delete_records)
self.layout().addWidget(self.save_btn)
self.layout().addWidget(self.load_btn)
self._dict = "Name": [], "Roll No": [], "Gender": [], "class": [], "section": []
self.createTable()
def createTable(self):
self.tableWidget = QtWidgets.QTableWidget()
self.tableWidget.horizontalHeader().setStretchLastSection(True)
self.tableWidget.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Stretch)
self.tableWidget.setColumnCount(5)
self.tableWidget.setHorizontalHeaderLabels(self._dict.keys())
self.layout().insertWidget(0, self.tableWidget)
def deleteRecords(self):
self.tableWidget.clearContents()
def addRow(self):
self.tableWidget.insertRow(self.tableWidget.rowCount())
def getRowValues(self) -> dict: # gets the row values
ord_dict = copy.deepcopy(self._dict)
for row in range(self.tableWidget.rowCount()):
for index, column in enumerate(ord_dict.keys()):
item = self.tableWidget.item(row, index)
value = ""
if item:
value = item.text()
ord_dict[column].append(value)
return ord_dict
def serialize(self):
val = self.getRowValues()
with open('data1.pickle', 'wb') as write:
pickle.dump(val, write)
def deserialize(self):
with open('data1.pickle', 'rb') as read:
val = pickle.load(read) # loads a dict
self.tableWidget.deleteLater() # removes the table
self.createTable() # recreates the tables
self.tableWidget.setRowCount(len(list(val.values())[0])) # sets the number of rows
for column, lst in enumerate(val.values()):
for row, x in enumerate(lst):
self.tableWidget.setItem(row, column, QtWidgets.QTableWidgetItem(x))
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
win = App()
win.show()
sys.exit(app.exec_())
在上面的代码中,我写了serialize
和deserialize
方法来保存和恢复表。
在添加 pickle 文件中的值之前,请确保清除表内容。在我的代码中,我只是删除了表格小部件并再次添加它。您也可以使用QTableWidget.clearContents()
,但这只会删除行内的内容,而不是行本身。
编辑:
我刚刚意识到您也可以使用self.tableWidget.setRowCount(0)
而不是删除并重新创建表。
所以在我的代码中你可以替换它:
self.tableWidget.deleteLater() # removes the table
self.createTable() # recreates the tables
self.tableWidget.setRowCount(0)
【讨论】:
以上是关于将 Qtable 中的多条记录保存到 Pickle的主要内容,如果未能解决你的问题,请参考以下文章
Cakephp:使用一个comman字段将多条记录添加到单个模型