Python ValueError:无效的文件路径或缓冲区对象类型:<;类别';tkinter.StringVar'&燃气轮机;

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

这里是我所拥有的一些代码的简化版本。在第一帧中,用户使用“tk.filedialog”选择一个csv文件,并将其打印在画布上的同一帧上

还有第二个框架,它能够绘制图形,以防在不同的框架中更容易绘制

运行此版本的代码会导致错误:“ValueError:无效的文件路径或缓冲区对象类型:”。我不知道如何让这段代码正常工作,而不会出现这个问题,因此用户选择的文件将绘制在带有列“a”和“b”的空图形上

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