您将需要从表格行中获取文本值,并将其存储在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)