我在 tkinter 画布中创建了一个移动点动画来表示加载。每当我向文本小部件输入内容时,它应该立即显示这个移动动画。 5 秒后,它应该消失。这就是所需的功能。我不知道下面的代码有什么问题。有人可以帮助我实现我所描述的目标吗?
import tkinter as tk
from tkinter import ttk
import time
def animate_dot(canvas, dot, dx):
canvas.move(dot, dx, 0)
x_pos = canvas.coords(dot)[0]
if x_pos >= 150 or x_pos <= 50:
dx *= -1 # Change direction when reaching the edge
canvas.after(10, animate_dot, canvas, dot, dx) # Increase speed by reducing the delay
def send_message(event=None):
message = message_entry.get(1.0, "end-1c")
message = message.strip()
message_entry.delete(1.0, tk.END)
message_entry.update()
if not message:
pass
else:
canvas1.place(x=510,y=90)
canvas1.update()
animate_dot(canvas1, dot, dx)
time.sleep(5)
canvas1.forget()
root = tk.Tk()
root.title("Chat")
# Maximize the window
root.attributes('-zoomed', True)
canvas1 = tk.Canvas(root, width=250, height=70, bg="white", borderwidth=0, highlightthickness=0)
# Display "Loading" text
loading_text = canvas1.create_text(50, 50, text="Loading", anchor="e")
# Create a black dot
dot = canvas1.create_oval(50, 40, 60, 50, fill="black")
dx = 1 # Increase the initial movement speed
message_entry = tk.Text(root, padx=17, insertbackground='white', width=70, height=1, spacing1=20, spacing3=20, font=('Open Sans', 14))
message_entry.pack(side=tk.LEFT, padx=(500, 0), pady=(0, 70))
message_entry.bind("<Return>", send_message)
#message_entry.bind("<Button-1>", click
message_entry.focus_set()
root.mainloop()
您应该避免在主线程中调用
time.sleep()
,因为它会阻止 tkinter mainloop()
处理挂起的事件和更新。
您应该检查动画是否应在
animate_dot()
内停止。建议在animate_dot()
中添加两个参数:
countdown
- 动画应运行多长时间(以毫秒为单位)delay
- 点移动之间的睡眠周期(以毫秒为单位)更新代码:
# added arguments countdown (default 5000ms) and delay (default 10ms)
def animate_dot(canvas, dot, dx, countdown=5000, delay=10):
canvas.move(dot, dx, 0)
x_pos = canvas.coords(dot)[0]
if x_pos >= 150 or x_pos <= 50:
dx *= -1 # Change direction when reaching the edge
if countdown > 0:
# keep animation
canvas.after(delay, animate_dot, canvas, dot, dx, countdown-delay, delay) # Increase speed by reducing the delay
else:
# stop animation, so remove the canvas
canvas1.place_forget()
def send_message(event=None):
message = message_entry.get(1.0, "end-1c")
message = message.strip()
message_entry.delete(1.0, tk.END)
message_entry.update()
if not message:
pass
else:
canvas1.place(x=510,y=90)
canvas1.update()
animate_dot(canvas1, dot, dx)
# don't call sleep() here
#time.sleep(5)
#canvas1.forget()