使用PyQt5保存熊猫数据框

时间:2020-11-05 15:20:02

标签: python pandas dataframe pyqt5

我在Qt设计器中创建了一个带有两个按钮和表格视图的简单窗口,然后将用户界面另存为 user_interface.ui kotlin-android Gradle plugin docs是用户界面。

Here

然后,我使用以下代码生成一些随机数据,然后单击 Generate data and display (单击并显示它们)在窗口上显示它们。我还有一个保存按钮,可让用户选择将生成的数据另存为csv:

import sys
import pandas as pd

from numpy.random import randn
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.uic import loadUiType

ui,_=loadUiType('user_interface.ui')


class MainApp(QMainWindow, ui):
    def __init__(self, parent=None):
        QMainWindow.__init__(self)
        self.setupUi(self)

        self.generate_table.clicked.connect(self.generate_data)

    def generate_data(self):
        df = pd.DataFrame(randn(5,4),index='A B C D E'.split(),columns='W X Y Z'.split())
        model = pandasModel(df)
        self.tableView.setModel(model)

        self.save_as_csv.clicked.connect(lambda: self.save_data_as_csv(df))

    def save_data_as_csv(self, df):
        name = QFileDialog.getSaveFileName(self, 'Save File', filter='*.csv')
        if(name[0] == ''):
            pass
        else:
            df.to_csv(name[0], index = False)

class pandasModel(QAbstractTableModel):

    def __init__(self, data):
        QAbstractTableModel.__init__(self)
        self._data = data

    def rowCount(self, parent=None):
        return self._data.shape[0]

    def columnCount(self, parnet=None):
        return self._data.shape[1]

    def data(self, index, role=Qt.DisplayRole):
        if index.isValid():
            if role == Qt.DisplayRole:
                return str(self._data.iloc[index.row(), index.column()])
        return None

    def headerData(self, col, orientation, role):
        if orientation == Qt.Horizontal and role == Qt.DisplayRole:
            return self._data.columns[col]
        return None


def main():
    app=QApplication(sys.argv)
    QApplication.processEvents()
    window = MainApp()
    window.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

当我点击 Generate data and display 按钮时,它工作正常,我看到了生成的表格。如果我一直按此按钮,我确实会看到随机数发生变化,这正是我想要的。

问题是,当我要保存生成的数据时,如果单击20次 Generate data and display 来更改数据,则会要求我20次(除非我在“保存”弹出窗口中单击“取消”,否则它基本上是试图保存每次 生成数据并显示 按钮。我要保存的只是我点击 另存为csv 按钮之前最新生成的数据。我不知道该怎么做才能实现这一目标?

1 个答案:

答案 0 :(得分:1)

之所以会这样,是因为每次调用save_data_as_csv时,信号的另一个实例都连接到generate_data。而是在构造函数中声明一次信号连接,并保留指向类(self.df)中最新数据帧的指针,因此不再需要将数据帧作为参数传递。

class MainApp(QMainWindow, ui):
    def __init__(self, parent=None):
        QMainWindow.__init__(self)
        self.setupUi(self)

        self.generate_table.clicked.connect(self.generate_data)
        self.save_as_csv.clicked.connect(self.save_data_as_csv)

    def generate_data(self):
        self.df = pd.DataFrame(randn(5,4),index='A B C D E'.split(),columns='W X Y Z'.split())
        model = pandasModel(self.df)
        self.tableView.setModel(model)

    def save_data_as_csv(self):
        name = QFileDialog.getSaveFileName(self, 'Save File', filter='*.csv')
        if(name[0] == ''):
            pass
        else:
            self.df.to_csv(name[0], index = False)