为什么在tkinter中.destroy()对标签无效?
我正在制作一个登录系统。当你输入错误的用户名或密码时,它会显示“用户名或密码错误”。然后,当你输入正确的用户名或密码时,应该把之前的错误信息删除,显示新的信息。但是现在的问题是,之前的错误信息没有被删除,反而是在新的信息下面显示出来了,像这样:用户名或密码错误 它重叠了
这是我的代码:
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)
我尝试过删除之前的错误信息,我本来期待它能把旧的信息删掉,显示新的信息,但结果却是新的信息覆盖在旧的信息上面。
2 个回答
0
看起来主要的问题是 tkinter 没有正确地销毁标签,而导致这个问题的原因就是你这两行代码:
login_un = tk.Label()
login_suc= tk.Label()
你只需要调整一下,把这两行改成这样:
try:
login_un.destroy()
login_suc.destroy()
except:
pass
我也试过 acw1668 的代码,但对我来说不管用。不过他的解释和分析完全正确。这就是你代码不工作的原因。
你创建了两个空字符串的标签,然后在 submit_li() 的开头就销毁了它们。接着你又创建了一个用于显示登录状态的标签。因此,后面的标签就永远不会被销毁。
我觉得这个会对你有帮助。
2
你创建了两个空的标签,然后在submit_li()
函数开始的时候把它们删除了。接着你又创建了一个用于显示登录状态的标签。所以后面那个标签是不会被删除的。
你可以简单地在函数外面创建一次登录状态的标签,然后在函数里面更新它的内容:
def submit_li(usern, passw, screen):
global login
password = str(passw)
username = str(usern)
for user in users:
if username == user[0] and password == user[1]:
login = True
msg = f"{username} has logged in!"
break
else:
login = False
msg = "Username or password incorrect"
# update the login status label
login_status.config(text=msg)
...
# create the label for login status
login_status = tk.Label(screen, font=('Arial', 13))
login_status.grid(row=3, column=0, columnspan=2)
...