2015-02-06 62 views
0

我开始学习Python和tkinter包,并且正在编写一个程序来在GUI窗口中加载文本文件。要打开文件浏览器,我安装了按钮及其必要的功能,如下面的代码所示。该程序运行,但当我点击“浏览”按钮,我收到一个属性错误说:“'assign_1'对象没有属性'var_filename'”。如果有人能帮助我,这将是非常棒的。使用tkinter在python GUI中打开文件对话框的属性错误

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

回答

1

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

问题是您尝试使用self.var_filename.set(...)而未定义self.var_filename是什么。如果您希望它是StringVar,这似乎是您使用setget后的情况,您必须对其进行初始化。要做到这一点,你应该把self.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() 
1

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

您还没有定义任何地方self.var_filename,这样的话它会给你的错误:

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

在功能close_window_callback,你也有错的压痕。

+0

identation不一个问题...没有定义self.var_filename是问题...我现在得到它..谢谢! – Taral 2015-02-07 18:14:05

+0

@Taral现在显示您的代码,缩进也是问题。 – nbro 2015-02-07 19:28:34

+0

我将不得不从下次更好地重新排列......在我的编辑器中,它的设计得当。感谢您的时间和帮助。 – Taral 2015-02-08 17:47:48