Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python上的pyQt5 GUI中创建和访问多个数据集?_Python_Pandas_Pyqt5 - Fatal编程技术网

如何在python上的pyQt5 GUI中创建和访问多个数据集?

如何在python上的pyQt5 GUI中创建和访问多个数据集?,python,pandas,pyqt5,Python,Pandas,Pyqt5,我的PyQt5 GUI代码有一些问题。我想做的是使用actionLoad_file菜单向用户请求一个文件。然后,我想使用位于另一个文件中的LoadFile函数导入数据集。问题是,我不知道如何将用户选择的文件名分配给LoadFile函数生成的数据帧。目标是允许多次导入,并为每次单击生成一个数据帧。 此外,例如,我不知道如何在另一种方法中访问我的数据帧 我希望我是清楚的。。。提前谢谢你的帮助。 这里是主要功能 import sys import tkinter import os.path from

我的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=",")

在我的例子中,您可能正在寻找类似的内容,只需加载一个.ini文件放入主窗口,并使用实际的PyQt5将文件名与self一起存储在主窗口中:

BASEDIR = os.path.dirname(__file__)

def readFile(self):  # ? Open
    """Restores GUI user input from a config file"""
    #* File dialog
    self.filename, _ = qtw.QFileDialog.getOpenFileName(
        self,
        "Select a configuration file to load…",
        BASEDIR,
        'Configuration Files (*.ini)',
        options=qtw.QFileDialog.DontResolveSymlinks
    )
    #* Invalid file or none
    if self.filename == "":
        qtw.QMessageBox.critical(
            self, "Operation aborted", "Empty filename or none selected. \n Please try again.",
            qtw.QMessageBox.Ok
        )
        self.statusBar().showMessage("Select a valid configuration file")
    #* Valid file
    else:
        if self.filename.lower().endswith('.ini'):
            try:
                <...> # your code

            except Exception or TypeError as e:
                qtw.QMessageBox.critical(self, 'Error', f"Could not open settings: {e}")
        else:
            qtw.QMessageBox.critical(
                self, "Invalid file type", "Please select a .ini file.", qtw.QMessageBox.Ok
            )

我不知道为什么在Qt内置了一个完全可用的文件对话框的情况下使用tkinter文件对话框

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

下面是您的示例的外观。在本例中,按下plot(打印)按钮将打印列表中第一个选定项目的数据

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

嘿,谢谢你的快速回答。我对python编程相当陌生。你能再给我解释一下你的代码吗?什么是Qwt?你能描述一下self.filename变量吗。_u用于存储文件名?提前感谢。qtw是导入QtWidgets时的别名。您可以键入:fromPyQT5将QtWidgets作为qtw导入。你加上了自我。将其存储为该类的变量,并在readFile方法之外访问它。下划线保存了getOpenFileName返回的扩展名,但它不打算在我的代码中使用,因此根据惯例,下划线是被丢弃变量的名称。好吧,现在对我来说更清楚了:我知道我可以通过调用self.filename以另一种方法访问文件名。但如果我用我的函数加载两个文件,例如x和y。我想知道如何用另一种方法访问。。当我尝试self.x或self.y时,它不起作用。可能是因为变量名仍然是文件名?提前感谢如果您想同时加载多个文件,请改用GetOpenFileName,它将返回一个文件名列表,您可以通过它们的索引访问这些文件名。谢谢您的回答,这正是我所期待的。现在它工作得很好!!!:嘿,如果可能的话,我还有一个简短的问题。。。对于绘图,当用户在If循环中要求特定参数时,我会过滤一些数据。但是,当我想加载原始数据时,它们似乎会根据参数进行修改。。。列表中存储的数据是否存在记忆效应?我试着复制而不是拥有一套原始的,但它们仍然被修改。。。提前谢谢你的回答。最好的是,我刚刚解决了这个问题:我将数据从项中复制到一个临时变量中,以避免它们被修改。