You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tkinter中Toplevel使用报错:'function'无'tk'属性的解决求助

问题分析与解决

错误原因

  1. 全局变量名称不匹配:在welcome_screen函数中,声明了global welcome_screen,但实际创建主窗口时赋值给了welcomeScreen(大小写差异),导致全局变量welcome_screen仍然指向welcome_screen函数本身,而非Tk窗口实例。当register函数中调用Toplevel(welcome_screen)时,传入的是函数对象而非窗口对象,因此触发'function' object has no attribute 'tk'错误。
  2. 函数名被全局变量覆盖:register函数中的global register会将register函数名覆盖为全局变量,后续调用会出现异常;同理login函数中的global login也错误覆盖了login函数本身。
  3. 登录窗口变量绑定错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 12:54:25