Tkinter中Toplevel使用报错:'function'无'tk'属性的解决求助
问题分析与解决
错误原因
- 全局变量名称不匹配:在
welcome_screen函数中,声明了global welcome_screen,但实际创建主窗口时赋值给了welcomeScreen(大小写差异),导致全局变量welcome_screen仍然指向welcome_screen函数本身,而非Tk窗口实例。当register函数中调用Toplevel(welcome_screen)时,传入的是函数对象而非窗口对象,因此触发'function' object has no attribute 'tk'错误。 - 函数名被全局变量覆盖:
register函数中的global register会将register函数名覆盖为全局变量,后续调用会出现异常;同理login函数中的global login也错误覆盖了login函数本身。 - 登录窗口变量绑定错误:
login函数中username_verify和password_verify被赋值为空字符串,而Entry控件的textvariable需要绑定StringVar对象,否则无法正常获取输入内容。
修改步骤
- 修正
welcome_screen函数中的变量名,将welcomeScreen改为welcome_screen,确保全局变量指向主窗口实例。 - 删除
register函数中的global register和login函数中的global login,避免函数名被覆盖。 - 将
login函数中的username_verify = ""和password_verify = ""改为StringVar()实例,保证输入框绑定正常。 - 所有控件创建时明确指定父窗口,代码更规范。
修正后的关键代码片段
def welcome_screen(): global welcome_screen welcome_screen = Tk() # 变量名与全局变量一致 welcome_screen.geometry("550x375") welcome_screen.title("Account Login") Button(welcome_screen, text="Register", height="3", width="30", command=register).pack() Label(welcome_screen, text="").pack() def register(): # 移除global register,避免覆盖函数 global register_screen global username global password global verifyPassword global username_entry global password_entry global verifyPassword_entry register_screen = Toplevel(welcome_screen) # 传入正确的窗口实例 register_screen.title("Register") register_screen.geometry("550x375") username = StringVar() password = StringVar() verifyPassword = StringVar() Label(register_screen, text="Please enter your new account details").pack()
完整修正代码
from tkinter import * def welcome_screen(): global welcome_screen welcome_screen = Tk() # 修正变量名,与全局变量一致 welcome_screen.geometry("550x375") welcome_screen.title("Account Login") # 所有控件明确指定父窗口 Label(welcome_screen, text="").pack() Label(welcome_screen, text="Welcome", width="50", height="4", font=("Calibri", 17)).pack() Button(welcome_screen, text="Login", height="3", width="30", command=login).pack() Label(welcome_screen, text="").pack() Button(welcome_screen, text="Register", height="3", width="30", command=register).pack() Label(welcome_screen, text="").pack() Button(welcome_screen, text="Exit", height="2", width="10").pack() Label(welcome_screen, text="").pack() Label(welcome_screen, text="").pack() welcome_screen.mainloop() def register(): # 移除global register global register_screen global username global password global verifyPassword global username_entry global password_entry global verifyPassword_entry register_screen = Toplevel(welcome_screen) register_screen.title("Register") register_screen.geometry("550x375") username = StringVar() password = StringVar() verifyPassword = StringVar() Label(register_screen, text="").pack() Label(register_screen, text="").pack() Label(register_screen, text="Please enter your new account details",font = ("calibri", 17 )).pack() Label(register_screen, text="").pack() username_lable = Label(register_screen, text="NEW USERNAME ",font=("calibri", 12)) username_lable.pack() username_entry = Entry(register_screen, textvariable=username) username_entry.pack() password_lable = Label(register_screen, text="NEW PASSWORD ",font=("calibri", 12)) password_lable.pack() password_entry = Entry(register_screen, textvariable=password, show='*') password_entry.pack() verifyPassword_lable = Label(register_screen, text="VERIFY PASSWORD ", font=("calibri", 12)) verifyPassword_lable.pack() verifyPassword_entry = Entry(register_screen, textvariable=verifyPassword, show='*') verifyPassword_entry.pack() Label(register_screen, text="").pack() Button(register_screen, text="Register", width=9, height=1, command=register_user).pack() def register_user(): username_info = username.get() password_info = password.get() total = "" for char in range(len(username_info)): total = total + str(ord(username_info[char])) username_info = total total2 = "" for character in range(len(password_info)): total2 = total2 + str(ord(password_info[character])) password_info = total2 with open("usernames and passwords","a") as file: file.write(username_info + "\n") file.write(password_info + "\n") username_entry.delete(0, END) password_entry.delete(0, END) verifyPassword_entry.delete(0, END) Label(register_screen, text="Registration Success", fg="green", font=("calibri", 13)).pack() def login(): # 移除global login global username_verify global password_verify login_screen = Toplevel(welcome_screen) login_screen.title("Login") login_screen.geometry("550x375") Label(login_screen, text="").pack() Label(login_screen, text="").pack() Label(login_screen, text="Please enter details below to login",font = ("calibri", 17 )).pack() Label(login_screen, text="").pack() username_verify = StringVar() # 改为StringVar实例 password_verify = StringVar() Label(login_screen, text="USERNAME ",font=("calibri", 12)).pack() username_login_entry = Entry(login_screen, textvariable=username_verify) username_login_entry.pack() Label(login_screen, text="PASSWORD ",font=("calibri", 12)).pack() password__login_entry = Entry(login_screen, textvariable=password_verify, show= '*') password__login_entry.pack() Label(login_screen, text="").pack() Button(login_screen, text="Login", width=9, height=1, command=login_verification).pack() Label(login_screen, text="",font=("calibri", 3)).pack() Button(login_screen, text="Back", width=9, height=1, command=welcome_screen).pack() def login_verification(): print("working...") welcome_screen()
内容的提问来源于stack exchange,提问作者hhrymc
相关产品推荐
相关产品推荐

