ValueError:无效的文件路径或缓冲区对象类型:< class'tkinter.StringVar'> [英] ValueError: Invalid file path or buffer object type: <class 'tkinter.StringVar'>

查看:265
本文介绍了ValueError:无效的文件路径或缓冲区对象类型:< class'tkinter.StringVar'>的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我拥有的某些代码的简化版本.在第一帧中,用户使用'tk.filedialog'选择一个csv文件,并且它打算被绘制在画布上的同一帧上.

Here is a simplified version of some code that I have. In the first frame, the user selects a csv file using 'tk.filedialog' and it is meant to be plotted on the same frame on the canvas.

还有第二个框架可以绘制图形,以防在不同的框架上绘制图形更加容易.

There is also a second frame that is capable of plotting the graph in case it is easier to do it across a different frame.

运行此版本的代码将导致错误:"ValueError:无效的文件路径或缓冲区对象类型:".我不确定如何在没有出现此问题的情况下使此代码正常工作,以便用户选择在带有"a"和"b"列的空白图形上绘制文件.

Running this version of the code results in the error: "ValueError: Invalid file path or buffer object type: ". I am not sure how to get this code to work without this problem occurring, so that the user selected file plots on the empty graph with columns 'a' and '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.

As far as I'm aware it's not possible to upload a .csv file onto StackOverflow so I have recreated an example one, but the file type needs to be .csv.

a,b
1,10
2,32
3,23
4,5
5,4
6,66
7,7
8,19
9,31
10,44

推荐答案

我尚未运行您的简化"版本的代码,因为它绝不是 一个

I haven't run your 'simplified' version of the code because it's by no means a Minimal, Complete, and Verifiable example.

该错误告诉您,当您假设某对象为 StringVar 时,它是路径或缓冲区.我相信错误即将发生:

The error tells you that you're assuming something is a path or buffer when it is StringVar. I believe the error is on the line:

df = pd.read_csv(filename, encoding='latin-1')

这需要 filename 作为路径或缓冲区对象,而在 filename 上方的那一行确实是 StringVar 对象:

this requires filename to be a path or buffer object where as on the very line above filename is indeed a StringVar object:

filename = tk.StringVar()

df = pd.read_csv(filename, encoding='latin-1')

为了达到 StringVar 或任何Variable子类类型的值,需要使用 get 方法.

In order to reach the value of StringVar or any of the Variable subclass types, one needs to use get method.

filename.get()

但是,这将导致一个空字符串'',这将引发另一个错误.

However, that would result an empty string, '' which would raise another error.

这篇关于ValueError:无效的文件路径或缓冲区对象类型:< class'tkinter.StringVar'>的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆