Tkinter登录按钮用Sleep未实现密码框闪红效果求助
问题原因
Tkinter是单线程GUI框架,你用的time.sleep()会直接阻塞主事件循环——设置输入框为红色后,界面根本没机会刷新这个状态,等sleep结束直接变回白色,所以用户看不到变红的过程。
解决方案
用Tkinter自带的after()方法替代time.sleep(),它会在指定毫秒后调度函数执行,完全不会阻塞界面刷新。
修改后的完整代码
# A program creates a window on your screen using Tkinter. import tkinter as tk def testmybutton(): Correctpassword = "Pa$$w0rd" frame_auth.tkraise() password = ent_password.get() username = ent_username.get() if password == Correctpassword: lbl_new.config(text='Logged in') else: frame_login.tkraise() ent_password.config(bg="red") # 延迟2000毫秒(2秒)后恢复输入框原色 root.after(2000, lambda: ent_password.config(bg='white')) # main window root = tk.Tk() root.wm_geometry("200x150") root.title('Authorization') frame_login = tk.Frame(root) frame_login.grid(row=0, column=0, stick='NEWS') lbl_username = tk.Label(frame_login, text='Username:', cursor="heart", bg='white', relief='flat') lbl_username.pack() ent_username = tk.Entry(frame_login, bd=5) ent_username.pack(padx=40) lbl_password = tk.Label(frame_login, text='password:', cursor="heart", bg='white', relief='flat') lbl_password.pack() ent_password = tk.Entry(frame_login, bd=5, show='+') ent_password.pack(padx=40) lbl_button = tk.Button(frame_login, text='LOG IN:', cursor="pirate", bg='white', relief='raised', command=testmybutton) lbl_button.pack() frame_auth = tk.Frame(root) frame_auth.grid(row=0, column=0, stick='NEWS') lbl_new = tk.Label(frame_auth, text='New Window:', cursor="heart", bg='white', relief='flat') lbl_new.pack() frame_login.tkraise() root.mainloop()
补充说明
after(delay_ms, callback):第一个参数是延迟的毫秒数,第二个参数是要执行的函数,用lambda可以直接传递带参数的配置操作- 永远别在Tkinter主线程里用
time.sleep()、死循环这类阻塞操作,否则界面会直接假死
内容的提问来源于stack exchange,提问作者Helvetica4011
相关产品推荐
相关产品推荐

