将 Qtable 中的多条记录保存到 Pickle
Saving multiple record from Qtable into Pickle
def save():
file=open("data1.pickle","wb")
pickle.dump(table,file)
file.close()
print("data saved")
我想将 table 中显示的记录保存到 pickle 文件中,当我单击上传时,所有记录应该再次显示。我该怎么做?请帮助。
您将需要从 table 行中获取文本值并将其存储在与它们的列 header 相关的 dict
中。然后您可以使用 pickle 保存 dict
。
请参阅以下示例以了解我将如何保存 table
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
方法来保存和恢复table。
在添加 pickle 文件中的值之前,请确保清除 table 内容。在我的代码中,我只是删除 table 小部件并再次添加它。您也可以使用 QTableWidget.clearContents()
,但这只会删除行内的内容,而不是行本身。
编辑:
我刚刚意识到您也可以使用 self.tableWidget.setRowCount(0)
而不是删除并重新创建 table.
所以在我的代码中你可以替换这个:
self.tableWidget.deleteLater() # removes the table
self.createTable() # recreates the tables
和self.tableWidget.setRowCount(0)
def save():
file=open("data1.pickle","wb")
pickle.dump(table,file)
file.close()
print("data saved")
我想将 table 中显示的记录保存到 pickle 文件中,当我单击上传时,所有记录应该再次显示。我该怎么做?请帮助。
您将需要从 table 行中获取文本值并将其存储在与它们的列 header 相关的 dict
中。然后您可以使用 pickle 保存 dict
。
请参阅以下示例以了解我将如何保存 table
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
方法来保存和恢复table。
在添加 pickle 文件中的值之前,请确保清除 table 内容。在我的代码中,我只是删除 table 小部件并再次添加它。您也可以使用 QTableWidget.clearContents()
,但这只会删除行内的内容,而不是行本身。
编辑:
我刚刚意识到您也可以使用 self.tableWidget.setRowCount(0)
而不是删除并重新创建 table.
所以在我的代码中你可以替换这个:
self.tableWidget.deleteLater() # removes the table
self.createTable() # recreates the tables
和self.tableWidget.setRowCount(0)