在其定义类

时间:2018-04-18 03:25:11

标签: python class

我有一个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并在整个程序中使用它?

1 个答案:

答案 0 :(得分:0)

在使用类之前,需要创建一个对象实例,它将隐式调用__init__方法来设置局部变量。所以在login中,第一行应该是:

mw = main_window()

然后所有来电都应该是mw,例如mw.Current_User