python - 如何在 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=",")
解决方案
我不确定为什么在内置完美可用的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()
推荐阅读
- javascript - Eslint module.exports 解析错误意外令牌
- android - 我有一个最新的 Android SDK,我在 android studio 中看不到“设计选项卡”?(阅读所有类似的答案,但没有任何效果)
- java - 如果我添加/删除/更新可靠集合的元素,休眠会增加版本吗?
- android - OkHttp Websockets - 连接到 websocket 时添加一个主体
- javascript - 如何使用 Objective-C (ObjC) 和 JavaScript for Automation (JXA) 创建 HTTP 请求?
- netlogo - Netlogo - 选择距离特工给定距离的所有海龟
- javascript - 如何在不离开当前页面的情况下在 laravel 中发出 curl 请求
- php - 在 CentOS5 上禁用不推荐使用的密码后,如何使用 PHP 执行 SFTP 操作?
- angular - 引导后如何引用 APP_INITIALIZER 在服务中设置的属性
- entity-framework - Entity Framework 6 可以在 .NET Standard 项目中使用吗?