如何在python上的pyQt5 GUI中创建和访问多个数据集?
我的PyQt5 GUI代码有一些问题。我想做的是使用actionLoad_file菜单向用户请求一个文件。然后,我想使用位于另一个文件中的LoadFile函数导入数据集。问题是,我不知道如何将用户选择的文件名分配给LoadFile函数生成的数据帧。目标是允许多次导入,并为每次单击生成一个数据帧。 此外,例如,我不知道如何在另一种方法中访问我的数据帧 我希望我是清楚的。。。提前谢谢你的帮助。 这里是主要功能如何在python上的pyQt5 GUI中创建和访问多个数据集?,python,pandas,pyqt5,Python,Pandas,Pyqt5,我的PyQt5 GUI代码有一些问题。我想做的是使用actionLoad_file菜单向用户请求一个文件。然后,我想使用位于另一个文件中的LoadFile函数导入数据集。问题是,我不知道如何将用户选择的文件名分配给LoadFile函数生成的数据帧。目标是允许多次导入,并为每次单击生成一个数据帧。 此外,例如,我不知道如何在另一种方法中访问我的数据帧 我希望我是清楚的。。。提前谢谢你的帮助。 这里是主要功能 import sys import tkinter import os.path from
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循环中要求特定参数时,我会过滤一些数据。但是,当我想加载原始数据时,它们似乎会根据参数进行修改。。。列表中存储的数据是否存在记忆效应?我试着复制而不是拥有一套原始的,但它们仍然被修改。。。提前谢谢你的回答。最好的是,我刚刚解决了这个问题:我将数据从项中复制到一个临时变量中,以避免它们被修改。