如何在 tkinter python 中隐藏和显示画布?

问题描述 投票:0回答:1

我在 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()
python tkinter tkinter-canvas tkinter-entry tkinter-text
1个回答
0
投票

您应该避免在主线程中调用

time.sleep()
,因为它会阻止 tkinter
mainloop()
处理挂起的事件和更新。

您应该检查动画是否应在

animate_dot()
内停止。建议在
animate_dot()
中添加两个参数:

  1. countdown
    - 动画应运行多长时间(以毫秒为单位)
  2. 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()
© www.soinside.com 2019 - 2024. All rights reserved.