将 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_())

在上面的代码中,我写了serializedeserialize方法来保存和恢复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)