Tkinter中Label的.destroy()方法失效,登录提示标签重叠问题求助
登录系统提示Label重叠问题
我正在开发一个登录系统:
- 输入错误的用户名或密码时,界面会显示「Username or password incorrect」提示Label
- 输入正确内容时,本该销毁旧的提示Label并显示登录成功的新提示,但实际旧Label未被销毁,新提示直接重叠在旧Label上方
相关代码
def submit_li(usern, passw, screen): global users global login_un global login_suc login_un = tk.Label() login_suc= tk.Label() login_un.destroy() login_suc.destroy() password = str(passw) username = str(usern) global login login = False for user in users: if username == user[0] and password == user[1]: login = True if login: login_suc = tk.Label(screen, font=('Arial', 13), text=f"{username} has logged in!") login_suc.grid(column=0, row=3) login = False else: login_un = tk.Label(screen, font=('Arial', 13), text="Username or password incorrect") login_un.grid(column=0, row=3)
我尝试调用.destroy()方法删除旧Label,但结果依旧出现标签重叠。
问题根源
每次调用submit_li函数时,你都会重新创建空的login_un和login_suc Label实例,然后销毁这些新创建的空对象——这完全没触及之前显示在界面上的旧Label。原来的旧Label实例已经被新赋值的空Label覆盖,导致无法引用到它,自然无法销毁。
修复方案
方案1:维护两个全局Label变量
- 在函数外部提前初始化全局变量为
None - 创建新提示前,检查对应变量是否指向已存在的Label实例,存在则销毁
修改后的代码:
# 函数外初始化全局变量 login_un = None login_suc = None def submit_li(usern, passw, screen): global users global login_un global login_suc global login # 销毁已存在的提示Label if login_un is not None: login_un.destroy() login_un = None if login_suc is not None: login_suc.destroy() login_suc = None password = str(passw) username = str(usern) login = False for user in users: if username == user[0] and password == user[1]: login = True if login: login_suc = tk.Label(screen, font=('Arial', 13), text=f"{username} has logged in!") login_suc.grid(column=0, row=3) login = False else: login_un = tk.Label(screen, font=('Arial', 13), text="Username or password incorrect") login_un.grid(column=0, row=3)
方案2:复用单个Label变量(更简洁)
只维护一个全局Label,直接修改它的文本内容,无需反复创建和销毁:
login_msg = None def submit_li(usern, passw, screen): global users global login_msg global login password = str(passw) username = str(usern) login = False for user in users: if username == user[0] and password == user[1]: login = True # 首次创建Label if login_msg is None: login_msg = tk.Label(screen, font=('Arial', 13)) login_msg.grid(column=0, row=3) # 根据登录结果修改文本 if login: login_msg.config(text=f"{username} has logged in!") login = False else: login_msg.config(text="Username or password incorrect")
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

