Python ValueError:无效的文件路径或缓冲区对象类型:<;类别';tkinter.StringVar'&燃气轮机;
这里是我所拥有的一些代码的简化版本。在第一帧中,用户使用“tk.filedialog”选择一个csv文件,并将其打印在画布上的同一帧上 还有第二个框架,它能够绘制图形,以防在不同的框架中更容易绘制 运行此版本的代码会导致错误:“ValueError:无效的文件路径或缓冲区对象类型:”。我不知道如何让这段代码正常工作,而不会出现这个问题,因此用户选择的文件将绘制在带有列“a”和“b”的空图形上Python ValueError:无效的文件路径或缓冲区对象类型:<;类别';tkinter.StringVar'&燃气轮机;,python,csv,tkinter,openfiledialog,valueerror,Python,Csv,Tkinter,Openfiledialog,Valueerror,这里是我所拥有的一些代码的简化版本。在第一帧中,用户使用“tk.filedialog”选择一个csv文件,并将其打印在画布上的同一帧上 还有第二个框架,它能够绘制图形,以防在不同的框架中更容易绘制 运行此版本的代码会导致错误:“ValueError:无效的文件路径或缓冲区对象类型:”。我不知道如何让这段代码正常工作,而不会出现这个问题,因此用户选择的文件将绘制在带有列“a”和“b”的空图形上 import csv import pandas as pd import tkinter as tk
import csv
import pandas as pd
import tkinter as tk
from tkinter import filedialog
from tkinter import ttk
from tkinter import messagebox
import matplotlib
matplotlib.use("TkAgg")
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
from matplotlib.figure import Figure
fig = Figure(figsize=(5,4), dpi=100)
ax= fig.add_subplot(111)
LARGE_FONT= ("Verdana", 12)
class GUI(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
tk.Tk.wm_title(self, "GUI")
container = tk.Frame(self)
container.pack(side="top", fill="both", expand = True)
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
self.frames = {}
for F in (Home, Graph):
frame = F(container, self)
self.frames[F] = frame
frame.grid(row=0, column=0, sticky="nsew")
self.show_frame(Home)
def show_frame(self, cont):
frame = self.frames[cont]
frame.tkraise()
class Home(tk.Frame):
def __init__(self, parent, controller):
self.controller = controller
tk.Frame.__init__(self,parent)
label = tk.Label(self, text="Start Page", font=LARGE_FONT)
label.pack(pady=10, padx=10)
ftypes = [
('CSV files','*.csv')
]
def browsefunc2():
filename = tk.filedialog.askopenfilename(filetypes=ftypes)
pathlabel2.config(text=filename)
filename = filename.get()
return filename
#this line is just used to check that hard-coding in a filename works, which it does providing 'filename = tk.StringVar()' is removed
#filename = '...'
filename = tk.StringVar()
df = pd.read_csv(filename, encoding='latin-1')
browsebutton = tk.Button(self, borderwidth=0, text="Browse", command=browsefunc2, height=1, width=10)
browsebutton.pack()
pathlabel2 = tk.Label(self, borderwidth=0)
pathlabel2.pack()
canvas = FigureCanvasTkAgg(fig, self)
df.plot.scatter('a', 'b', ax=ax)
canvas.draw()
canvas.get_tk_widget().pack(side=tk.BOTTOM, fill=tk.BOTH, expand=True)
button2 = ttk.Button(self, text="Graph",
command=lambda: controller.show_frame(Graph))
button2.pack()
class Graph(tk.Frame):
def __init__(self, parent, controller):
self.controller = controller
tk.Frame.__init__(self,parent)
label = tk.Label(self, text="Graph", font=LARGE_FONT)
label.pack(pady=10,padx=10)
canvas = FigureCanvasTkAgg(fig, self)
#this line causes a problem as the dataframe is not recognised across frames
df.plot.scatter('a', 'b', ax=ax)
canvas.draw()
canvas.get_tk_widget().pack(side=tk.BOTTOM, fill=tk.BOTH, expand=True)
button3 = ttk.Button(self, text="Back",
command=lambda: controller.show_frame(Home))
button3.pack()
app = GUI()
app.mainloop()
据我所知,无法将.csv文件上载到StackOverflow,因此我重新创建了一个示例,但文件类型必须是.csv
a,b
1,10
2,32
3,23
4,5
5,4
6,66
7,7
8,19
9,31
10,44
我还没有运行您的“简化”版本的代码,因为它绝不是一个简单的版本 该错误告诉您,当它是
StringVar
时,您假设它是路径或缓冲区。我认为错误在于:
df = pd.read_csv(filename, encoding='latin-1')
这要求filename
是一个路径或缓冲区对象,而上面的filename
实际上是一个StringVar
对象:
filename = tk.StringVar()
df = pd.read_csv(filename, encoding='latin-1')
为了获得StringVar
或任何变量子类类型的值,需要使用get
方法
filename.get()
但是,这将导致一个空字符串,
'
,这将引发另一个错误。我在PyQt5中遇到了一个非常类似的问题。不确定发生了什么,我使用了打印(文件名)
,发现字符串
包含了过滤器信息(即(“*.csv”)
使用:
savePath,_filter=qtwidts.QFileDialog.getSaveFileName(无,“某些标题”、“某些文件.csv”、“csv文件(*.csv)”)
过滤器信息已剥离,保存工作正常。我在使用PyQt5打开文件时遇到此问题。在我的情况下,使用
filename = QFileDialog.getOpenFileName(self, 'Open file', '', 'csv(*.csv)')
文件对话框读取文件名+,“csv(*.csv)”)
要从QFileDialog或类似的东西中获取文件名,您可以获取该“文件名”中的第一个值
file = filename[0]
当您在构造函数内初始化文件名并将其传递给函数时,也会发生这种情况
class MainWindow(QtWidgets.QMainWindow):
send_fig = QtCore.pyqtSignal(str)
def __init__(self, plot_file=None):
super(MainWindow, self).__init__()
.
.
.
self.plot_file = "./filename.csv"
self.plot(self.plot_file)
def plot(self, file_name):
print(file_name)
df = pd.read_csv(file_name, encoding='utf-8', engine='python')
这会引发一个错误:
raise VALUERROR(消息格式(_type=type(文件路径或缓冲区)))
ValueError:无效的文件路径或缓冲区对象类型:类“int”
这应该可以很好地工作,要么在函数图中定义文件名,要么简单地将其作为以下内容传递给构造函数:
file_name = "./filename.csv"
app = QtWidgets.QApplication(sys.argv)
ex = MainWindow(file_name)
sys.exit(app.exec_())
file_name = "./filename.csv"
app = QtWidgets.QApplication(sys.argv)
ex = MainWindow(file_name)
sys.exit(app.exec_())