首页 > 解决方案 > 如何在 python 上的 pyQt5 GUI 中创建和访问多个数据集?

问题描述

我的 PyQt5 GUI 代码有一些问题。我想做的是使用 actionLoad_file 菜单向用户询问文件。然后我想使用位于另一个文件中的 LoadFile 函数导入数据集。问题是我不知道如何将用户选择的文件的名称分配给我的 LoadFile 函数生成的数据框。目标是允许多次导入并为每次点击生成一个数据框。另外,我不知道如何以另一种方法(例如绘图)访问我的数据框。

我希望我很清楚......在此先感谢您的帮助。这里是主要功能

import sys
import tkinter
import os.path
from tkinter.filedialog import askopenfilename
import matplotlib
from load_function import LoadFile #Importing homemade functions
from PyQt5 import QtCore, QtGui, QtWidgets, uic
import matplotlib.pyplot as plt

class gui_main(QtWidgets.QMainWindow):
def __init__(self):
    super(gui_main, self).__init__()
    uic.loadUi('GUI.ui', self)$
    self.plot_button.clicked.connect(self.plotting)
    self.actionLoad_file.triggered.connect(self.load_file_method)
    self.show()

def load_file_method(self):
    tkinter.Tk().withdraw()
    filepath = askopenfilename()
    filename = os.path.basename(filepath)
    file,extension = filename.rsplit('.')
    vars()[file] = LoadFile(filepath)
    gui_main.list_loaded_file.addItem(filename)

def plotting(self):
     plt.scatter(file.data["x"],file.data["y"])
     plt.show()

这是 LoadFile 函数:

import pandas
from sklearn import preprocessing

class LoadFile:
    def __init__(self,file):
        self.data = pandas.read_csv(open(file), delimiter=",")

标签: pythonpandaspyqt5

解决方案


我不确定为什么在内置完美可用的tkinter文件对话框时使用文件对话框。Qt

无论如何,据我了解这个问题,您希望能够读取多个文件,从这些文件中的数据创建数据帧,并将文件名存储在我假设为QListWidget命名的list_loaded_file. 然后,您希望能够在此列表中选择一个文件并绘制相应的数据。如果这确实是您想要的,那么您可以在通过 将数据框添加到列表小部件时将数据框作为数据添加到列表小部件项目中item.setData(role, data),其中role是一些整数 >= QtCore.Qt.UserRole。然后可以稍后通过 检索此数据帧item.data(role)

这是您的示例的样子。在本例中,按下绘图按钮将绘制列表中第一个选定项目的数据。

import os.path
import pandas as pd
from PyQt5 import QtCore, QtWidgets, uic
import matplotlib.pyplot as plt

from load_function import LoadFile


class gui_main(QtWidgets.QMainWindow):

    # role for storing the data frames in the items
    USERDATA_ROLE = QtCore.Qt.UserRole

    def __init__(self):
        # the same as before

    def load_file_method(self):
        # I'm using a QFileDialog to get the file path
        filepath, _ = QtWidgets.QFileDialog.getOpenFileName()
        if not filepath:
            return
        filename = os.path.basename(filepath)

        # read data and create data frame
        dataframe = LoadFile(filepath)

        # create list widget item and store data in item
        item = QtWidgets.QListWidgetItem(filename)
        item.setData(self.USERDATA_ROLE, dataframe)
        self.list_view.addItem(item)

    def plotting(self):
        # select first selected item in file list.
        items = self.list_view.selectedItems()
        if not items:
            return
        item = items[0]
 
        # retrieve and plot data
        data = item.data(self.USERDATA_ROLE)
        plt.scatter(data["x"], data["y"])
        plt.show()


if __name__ == "__main__":
    app = QtWidgets.QApplication([])
    main = gui_main()
    main.show()
    app.exec()

推荐阅读