在设定的时间后删除标签TkInter

时间:2017-12-17 13:28:25

标签: python python-3.x time tkinter python-3.5

我的代码目前检查输入用户的用户名和密码,然后返回带有相应文字的标签。

如下图所示:

from tkinter import *

def Login():
    global AnameEL
    global ApwordEL # More globals :D
    global ArootA
    global f1
    global f2

    ArootA = Tk() # This now makes a new window.
    ArootA.geometry('1280x720')
    ArootA.title('Admin login') # This makes the window title 'login'

    f1 = Frame(width=200, height=200, background="#D3D3D3")
    f2 = Frame(ArootA, width=400, height=200)

    f1.pack(fill="both", expand=True, padx=0, pady=0)
    f2.place(in_=f1, anchor="c", relx=.5, rely=.5)

    AnameL = Label(f2, text='Username: ') # More labels
    ApwordL = Label(f2, text='Password: ') # ^
    AnameL.grid(row=1, sticky=W)
    ApwordL.grid(row=2, sticky=W)

    AnameEL = Entry(f2) # The entry input
    ApwordEL = Entry(f2, show='*')
    AnameEL.grid(row=1, column=1)
    ApwordEL.grid(row=2, column=1)

    AloginB = Button(f2, text='Login', command=CheckLogin) # This makes the login button, which will go to the CheckLogin def.
    AloginB.grid(columnspan=2, sticky=W)

    ArootA.mainloop()

def CheckLogin():
    checkP = Label(f2, text='')
    checkP.grid(row=3, column=1)
    if AnameEL.get() == "test" and ApwordEL.get() == "123": # Checks to see if you entered the correct data.
        checkP.config(text='sucess')

    else:
        checkP.config(text='fail')

Login()

我想添加另一个功能,在2秒后运行新的代码行,具体取决于登录失败/成功。

例如,当用户输入错误的登录信息时,我希望文本"失败" 2秒后消失,如果用户输入正确的密码,我希望在成功"成功后2秒内运行一个新功能。正在展示。

所以我试过这个: (还在我的代码顶部导入时间)

if AnameEL.get() == "test" and ApwordEL.get() == "123": # Checks to see if you entered the correct data.
    checkP.config(text='sucess')
    time.sleep(2)
    nextpage()
else:
    checkP.config(text='fail')
    time.sleep(2)
    checkP.config(text='')

def nextpage():
    f1.destroy()

然而,这并不成功。按下登录按钮后,等待2秒,然后运行nextpage()而不是显示"成功"持续2秒然后运行nextpage()并且对于不正确的登录,按下按钮2秒后它会直接进入checkP.config(text='')

我该如何解决这个问题?

感谢所有帮助, 感谢。

1 个答案:

答案 0 :(得分:1)

您需要在使用time.sleep()之前更新root。此外,由于您正在处理GUI,因此您应该优先使用计时器而不是暂停执行。在这种情况下,Tkinter自己的after()函数应优先于time.sleep(),因为它只是将事件放在事件队列上而不是暂停执行。

  

之后(delay_ms,callback = None,* args)

     

注册在给定时间后调用的警报回调。

所以,根据你的例子:

if AnameEL.get() == "test" and ApwordEL.get() == "123":
    checkP.config(text='sucess')
    ArootA.update()
    time.sleep(2)
    nextpage()
else:
    checkP.config(text='fail')
    ArootA.update()
    time.sleep(2)
    nextpage()

使用after()

if AnameEL.get() == "test" and ApwordEL.get() == "123":
    checkP.config(text='sucess')
    ArootA.after(2000, nextpage)
else:
    checkP.config(text='fail')
    ArootA.after(2000, lambda : checkP.config(text=''))

您可能还想了解更新标签值的其他方法,以避免在您进入主循环时更新root(例如Making python/tkinter label widget update?)。