0

我开始学习 Python 和 tkinter 包,我正在编写一个程序来在 GUI 窗口上加载一个文本文件。为了打开文件浏览器,我安装了按钮及其必要的功能,如下面的代码所示。程序运行,但是当我单击“浏览”按钮时,我收到一个属性错误消息:“'assign_1' 对象没有属性'var_filename'”。如果有人可以帮助我,那就太好了。

from tkinter import *
from tkinter import messagebox
from tkinter import simpledialog
from tkinter import filedialog
from math import *
from numpy  import *
import string

root = Tk()

def close_window_callback(root):
   if messagebox.askokcancel("Quit", "Do you really wish to quit?"):
   root.destroy()


class assign_1:
    def __init__(self,master):
        self.master = master
        frame = Frame(master)
        frame.pack()
        self.canvas = Canvas(master,width=1000,height=1000, bg="yellow")


        self.button_browse = Button(frame, text="Browse",
command=self.browse_file)
        self.button_browse.pack()

        self.button_load = Button(frame, text="Load")
        self.button_load.pack(side = LEFT)

        self.canvas.pack(expand=YES, fill=BOTH)

def browse_file(self):
    self.var_filename.set(filedialog.askopenfilename(filetypes=[("allfiles","*"),("pythonfiles","*.txt")]))
    filename = self.var_filename.get()
    print(filename)

root.protocol("WM_DELETE_WINDOW", lambda root_window=root:  close_window_callback(root_window))
assign_1(root)

root.mainloop()
4

2 回答 2

1

缩进是错误的。browse_file您想要定义为类的方法的函数assign_1使用大写字母来声明类的名称)是您定义的全局函数。

你也没有self.var_filename在任何地方定义,所以它会给你错误:

AttributeError: 'assign_1' object has no attribute 'var_filename'

在功能下close_window_callback,您也有错误的缩进。

于 2015-02-06T01:38:48.383 回答
1

尽管正如 Rinzler 指出的那样,您发布的代码中的缩进错误的,但这会导致另一个错误(AttributeError: assign_1 instance has no attribute 'browse_file')。所以我猜你实际使用的代码中的缩进是正确的。

self.var_filename.set(...)问题是您在没有定义什么的情况下尝试使用self.var_filename。如果您希望它是 a ,因为您使用andStringVar似乎就是这种情况,您必须初始化它。为此,您应该放入类的功能。一个小例子证明了这一点:setgetself.var_filename = StringVar(master)__init__

root = Tk()

class assign_1:
    def __init__(self, master):
        self.master = master
        self.var_filename = StringVar(master)

        self.button_browse = Button(master, text="Browse", command=self.browse_file)
        self.button_browse.pack()

    def browse_file(self):
        self.var_filename.set(filedialog.askopenfilename(filetypes=[("allfiles","*"),("pythonfiles","*.txt")]))
        filename = self.var_filename.get()
        print(filename)


assign_1(root)
root.mainloop()

但是,从它的外观来看,在您的情况下,不需要使用 tkinter StringVar,只需使用普通的字符串变量:

root = Tk()

class assign_1:
    def __init__(self, master):
        self.master = master

        self.button_browse = Button(master, text="Browse", command=self.browse_file)
        self.button_browse.pack()

    def browse_file(self):
        self.filename = filedialog.askopenfilename(filetypes=[("allfiles","*"),("pythonfiles","*.txt")])
        print(self.filename)


assign_1(root)
root.mainloop()
于 2015-02-06T09:06:44.317 回答