You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 04:45:35