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

在上面的代码中,我写了serializedeserialize方法来保存和恢复表。

在添加 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字段将多条记录添加到单个模型

python中的pickle模块

python3 中的 _pickle 不适用于大数据保存

pickle模块

如何将多条记录中的有序数据返回到 MySQL 中的一条记录中?

使用pickle将巨大的二元字典保存到文件