为什么在tkinter中.destroy()对标签无效?

0 投票
2 回答
60 浏览
提问于 2025-04-14 16:25

我正在制作一个登录系统。当你输入错误的用户名或密码时,它会显示“用户名或密码错误”。然后,当你输入正确的用户名或密码时,应该把之前的错误信息删除,显示新的信息。但是现在的问题是,之前的错误信息没有被删除,反而是在新的信息下面显示出来了,像这样:用户名或密码错误 它重叠了

这是我的代码:

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)

...

撰写回答