使用 tkinter 在 python GUI 中打开文件对话框时出现属性错误
Attribute error in opening file dialog in python GUI using tkinter
我开始学习 Python 和 tkinter 包,我正在编写一个程序来在 GUI window 上加载文本文件。为了打开文件浏览器,我安装了按钮及其必要的功能,如下面的代码所示。程序运行,但当我单击 "browse" 按钮时,出现属性错误:“'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()
缩进错误。您想定义为 class assign_1
方法的函数 browse_file
( 使用大写字母声明 classes 的名称)是您定义的全局函数。
你也没有在任何地方定义 self.var_filename
,所以它会给你错误:
AttributeError: 'assign_1' object has no attribute 'var_filename'
在函数close_window_callback
下,你也有错误的缩进。
虽然,正如 Rinzler 指出的那样,您发布的代码中的缩进 是 错误,但这会导致另一个错误 (AttributeError: assign_1 instance has no attribute 'browse_file'
)。所以我猜你实际使用的代码中的缩进是正确的。
问题是您在没有定义 self.var_filename
是什么的情况下尝试使用 self.var_filename.set(...)
。如果你希望它是一个 StringVar
,因为你使用 set
和 get
,这似乎是这种情况,你必须初始化它。为此,您应该将 self.var_filename = StringVar(master)
放入 class' __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()
我开始学习 Python 和 tkinter 包,我正在编写一个程序来在 GUI window 上加载文本文件。为了打开文件浏览器,我安装了按钮及其必要的功能,如下面的代码所示。程序运行,但当我单击 "browse" 按钮时,出现属性错误:“'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()
缩进错误。您想定义为 class assign_1
方法的函数 browse_file
( 使用大写字母声明 classes 的名称)是您定义的全局函数。
你也没有在任何地方定义 self.var_filename
,所以它会给你错误:
AttributeError: 'assign_1' object has no attribute 'var_filename'
在函数close_window_callback
下,你也有错误的缩进。
虽然,正如 Rinzler 指出的那样,您发布的代码中的缩进 是 错误,但这会导致另一个错误 (AttributeError: assign_1 instance has no attribute 'browse_file'
)。所以我猜你实际使用的代码中的缩进是正确的。
问题是您在没有定义 self.var_filename
是什么的情况下尝试使用 self.var_filename.set(...)
。如果你希望它是一个 StringVar
,因为你使用 set
和 get
,这似乎是这种情况,你必须初始化它。为此,您应该将 self.var_filename = StringVar(master)
放入 class' __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()