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

Python Tkinter如何实现Canvas文本显示数秒后自动消失

问题原因

Tkinter所有界面渲染、交互响应都运行在主线程的mainloop()事件循环中,你使用time.sleep()会直接阻塞整个事件循环,导致你创建的提示文本没有机会完成渲染流程,等sleep结束后直接执行删除操作,自然看不到提示内容。另外你的代码还存在回调函数名和按钮变量名重名的问题,也可能引发调用异常。

解决方案

使用Tkinter自带的after()方法实现延迟逻辑,该方法会将延迟任务提交到事件队列,不会阻塞主线程运行,界面可以正常完成渲染。

修改后的完整代码
from tkinter import *

root = Tk()
root.title("Login Form")
root.configure(bg="#9febe9")
root.geometry("700x500")

# Creating Canvases
canvas = Canvas(root, width=500, height=380, bg="white")
canvas.place(relx=0.14, rely=0.122, anchor=NW)
main_rectange = canvas.create_rectangle(475, 0, 501, 500, outline="white", fill="#4286f5")
header_text = canvas.create_text(40, 50, text="Account Login", fill="#557ed5", font="Times 20 bold", anchor=NW)
user_name_text = canvas.create_text(40, 112, text="Username", fill="#a7a7a9", anchor=NW, font="20")
username_entry = Entry(canvas, borderwidth=0, bg="#e5e5e5")
canvas.create_window(40, 140, window=username_entry, anchor=NW, height=30, width=400)
canvas.create_text(40, 190, text="Password",  fill="#a7a7a9", anchor=NW, font="20")
password_entry = Entry(canvas, borderwidth=0, bg="#e5e5e5", show="*") # 新增show参数隐藏密码输入
canvas.create_window(40, 210, window=password_entry, anchor=NW, height=30, width=400)
canvas.create_text(55, 255, text="Remember Me", anchor=NW, fill="#9a9d9c")
canvas.create_text(330, 255, text="Forgot Password?", anchor=NW, fill="#6d829f", font="bold 9")
# 回调函数改名避免重名
login_button = Button(canvas, width=56, height=2, text="Log In", justify=CENTER, borderwidth=0, bg="#4286f5", fg="white", command=lambda: check_login())
canvas.create_window(40, 300, window=login_button, anchor=NW)

# Original Username and Password
original_username = "NightHawk510"
original_password = "ILOVECODING"

def check_login():
    username = username_entry.get()
    password = password_entry.get()
    # 先清空输入框
    username_entry.delete(0, END)
    password_entry.delete(0, END)
    
    if username == original_username and password == original_password:
        redirecting_text = canvas.create_text(40, 90, text="Credentials Match, Please Wait While We Redirect You To Your Vault", fill="red", anchor=NW)
        # 延迟1.5秒执行清空操作,不阻塞主循环
        root.after(1500, lambda: canvas.delete("all"))
        print("ESHTA")
    else:
        print("NOT ESHTA")
        wrong_credentials_text = canvas.create_text(40, 90, text="Wrong Credentials, Try again", fill="red", anchor=NW)
        # 延迟2秒删除错误提示
        root.after(2000, lambda: canvas.delete(wrong_credentials_text))

root.mainloop()
核心修改说明
  • 修正了按钮变量和回调函数重名的问题,避免逻辑异常
  • 移除了time.sleep()调用,所有延迟逻辑都通过root.after()实现,不会阻塞主事件循环,提示文本可以正常渲染显示
  • 额外给密码输入框加了show="*"参数,符合常规登录框的密码隐藏逻辑
  • 错误提示只会删除自身文本,不会影响界面其他元素,登录成功的提示延迟后再清空整个画布

内容的提问来源于stack exchange,提问作者Mark George

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 16:36:03