我有一个GUI,可以生成一个主窗口,以及其中的许多其他Toplevel窗口。我正在尝试使用tkinter的StringVar来存储登录到程序的当前用户的用户名,然后在其他Toplevel窗口中调用该变量(以及那些窗口中的函数)。每个Frame,Toplevel窗口和Main窗口都有自己独立的类。我觉得这是导致问题的原因。我不太确定如何在我定义它的类之外引用StringVar。
以下是我尝试实施它的方法:
(tkinter导入为tk)
class main_window(tk.Tk):
def __init__(self,*args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
self.title('Pilot Flight and Duty Tracker')
self.geometry('1000x700+250+50')
self.resizable(width = False, height = False)
self.frame = None
self.switch_frame(Cover_Frame)
Login_Window = Login(self)
menu = tk.Menu(self)
self.config(menu=menu)
filemenu = tk.Menu(menu)
menu.add_cascade(label="File", menu=filemenu)
filemenu.add_separator()
filemenu.add_command(label="Exit", command=self.destroy)
self.Current_User = tk.StringVar()
这是来自不同类别的Toplevel窗口试图调用变量的方法:
def login(self):
global Users
username = self.user_entry.get()
pw = self.password_entry.get()
if (username, pw) in Users:
if (username, pw) == ('Admin', 'AdminPassword'):
self.after(500, self.destroy)
self.warn.config(text='Login Successful!', bg='lime green', justify='center')
main_window.switch_frame(self.master, Blank_Frame)
Login_Creation = Create_Login(self.master)
else:
self.after(500, self.destroy)
main_window.Current_User.set(username)
print(main_window.Current_User.get())
main_window.switch_frame(self.master, Create_Profile)
self.warn.config(text='Login Successful!', bg='lime green', justify='center')
else:
self.warn.config(text="Invalid Username or Password", fg="black", bg='red', justify ='center')
不幸的是,我收到了这个错误:
AttributeError: type object 'main_window' has no attribute 'Current_User'
如何在不同的类中正确调用StringVar并在整个程序中使用它?
答案 0 :(得分:0)
在使用类之前,需要创建一个对象实例,它将隐式调用__init__
方法来设置局部变量。所以在login
中,第一行应该是:
mw = main_window()
然后所有来电都应该是mw
,例如mw.Current_User