首页 > 解决方案 > PYTHON / TKINTER - 如何访问另一个类中的变量

问题描述

我知道这已经被问过很多次了,但我无法弄清楚如何将显示的示例应用到我自己的代码中。我只开发了 3 个月,我目前正在制作一个健康应用程序,只是为了好玩。

以下是我认为与该问题相关的以下代码。

这些是用户名和密码输入的标签/字段(位于 SignUp 类中)

        #Username label/entry
        self.login_username_label = tk.Label(self.signinframe, text="Username:", fg='black', bg='light cyan', font=xsml_font)
        self.login_username_label.grid(row=1, column=0, padx=(10,0), pady=(25,0))
        self.login_username_entry = tk.Entry(self.signinframe, width=15, textvariable=self.USERNAME_ENTRY)
        self.login_username_entry.grid(row=1, column=1, padx=(0,0), pady=(25,0))

        #Password label/entry
        self.login_password_label = tk.Label(self.signinframe, text="Password:", fg='black', bg='light cyan', font=xsml_font)
        self.login_password_label.grid(row=2, column=0, padx=(10,0), pady=(15,0))
        self.login_password_entry = tk.Entry(self.signinframe, show="*", width=15, textvariable=self.PASSWORD_ENTRY)
        self.login_password_entry.grid(row=2, column=1, padx=(0,0), pady=(15,0))

        #Sign in button - COMMAND = self.sign_in
        self.sign_in_btn = tk.Button(self.signinframe, text="Sign In", command=self.sign_in, fg='white', \
        bg='light sea green')
        self.sign_in_btn.grid(row=3, column=1, padx=(0,20), pady=(15,0), sticky=tk.E)
        self.sign_in_btn.config(font=('Calibri', 14)) 

这是登录的功能,可以正常工作(位于 SignUp 类中)

    def sign_in(self):
        #Connect to db / create cursor
        db = sqlite3.connect('user.db')
        c = db.cursor()
        c.execute('SELECT * from users WHERE username="%s" AND password="%s"' % (self.login_username_entry.get(), self.login_password_entry.get(),))

        #If record found show login success label, then launch def launch
        if c.fetchone() is not None:
            #login failed label 
            self.login_succ_lbl = tk.Label(self.signinframe, text="Login Success.", fg='green',\
            bg='light cyan', font=sml_font)
            self.login_succ_lbl.place(relx=0.45, rely=0.7)
            #after 1500 launch home window
            self.main.after(1500, self.launch)
        
        #else show login failed label and clear fields for user to retry
        else:
            #clear username/password fields
            self.login_username_entry.delete(0, tk.END)
            self.login_password_entry.delete(0, tk.END)
            #login failed label
            self.login_fail_lbl = tk.Label(self.signinframe, text="Login failed. ", fg='red',\
            bg='light cyan', font=sml_font)
            self.login_fail_lbl.place(relx=0.45, rely=0.7)

显示的所有代码都包含在此类中

#SIGN UP CLASS (THIS IS THE SIGN UP/LOGIN PAGE)
class SignUp:
    def __init__(self, main):
        self.main = main
        #to use across classes as needed
        self.USERNAME_ENTRY = tk.StringVar()
        self.PASSWORD_ENTRY = tk.StringVar()


        #Make sign up window non-resizable 
        self.main.resizable(width=False, height=False)
        #call logo class
        logo = Logo(main)
        
        #MAIN FRAME FOR SIGNUP (OUTER FRAME THAT CONTAINS ALL INNER FRAMES)
        self.mainframe = tk.LabelFrame(self.main, text='Welcome to Health Tracker', fg='black', \
        bg='light cyan', labelanchor=tk.NW, width=660, height=560, borderwidth=2, highlightthickness=0, font=lge_font)
        self.mainframe.grid(row=1, column=0, padx=(5,5), pady=5, ipadx=15, ipady=15, sticky=tk.E)
        
        #Force frame size for sign up 
        self.mainframe.grid_propagate(False)

当用户登录时,它会将他们带到一个新页面,即此类

class Home:
    def __init__(self, main):
        self.main = main

        self.main.geometry("900x880")
        self.main.title("Welcome to Health Tracker")
        self.main.config(bg='white')
        #non resizable window 
        self.main.resizable(width=False, height=False)

我想在登录后使用 self.USERNAME_ENTRY 和 self.PASSWORD_ENTRY 变量向用户显示详细信息。但由于它们是 SignUp 类的一部分,因此在 Home 类中无法识别它们。我试图通过在 SignUp 类中为每个定义一个 tk.StringVar() 来调用它们,然后在 Home 类中调用它们,但这不起作用。这是我尝试过的。


    #USER STATS (part of the Home class)
        conn = sqlite3.connect("user.db")
        c = conn.cursor()

        c.execute('SELECT * from users WHERE username="%s" AND password="%s"' % (SignUp.USERNAME_ENTRY.get(), SignUp.PASSWORD_ENTRY.get(),)) 
        record = c.fetchone()

如何将 self.USERNAME_ENTRY 和 self.PASSWORD_ENTRY 的值从 SignUp 类传递到 Home 类?

此外,如果相关,则使用 if name == main 命令调用 SignUp 类,如下所示

#RUN TKINTER MAINLOOP       
def main(): 
    root = tk.Tk()
    #Declare the SignUp class to init program
    app = SignUp(root)
    
    #root config 
    root.geometry('700x690')
    root.title("Sign Up To Health Tracker")
    root.config(bg='white')

    #LOGOFRAME for app logo
    #Define logoframe size/position
    logoframe = tk.LabelFrame(root, bg="white", width=480, height=90, borderwidth=0, highlightthickness=0)
    logoframe.grid(row=0, column=0, columnspan=4, ipadx=25, sticky=tk.N)
    #force width and height on frame
    logoframe.grid_propagate(0)
    #Define logo image and grid position
    logo = tk.PhotoImage(file = "logo.png")
    logo_label = tk.Label(logoframe, image=logo, borderwidth=0, highlightthickness=0)
    logo_label.grid(row=0, column=0)
    
    #run mainloop for program
    tk.mainloop()

#run main if being run as standalone
if __name__ == '__main__':
    main()

标签: pythonsqlitetkinter

解决方案


推荐阅读