В приведенном ниже коде Python я использую message_entry.delete(1.0, tk.END) для удаления текста, введенного в текстовый виджет. Проблема в том, что он ждет 5 секунд, прежде чем текст будет удален. Я знаю, что это из-за time.sleep(5) в сценарии ниже.
Дело в том, что команда message_entry.delete(1.0, tk.END) находится над этой командой сна, поэтому она должна выполняться до этой команды сна и немедленно удалять текст. Почему оно ждет? Я хочу удалить текст, как только сообщение будет извлечено.
import tkinter as tk
from tkinter import ttk
from datetime import datetime
from PIL import Image, ImageTk
import time
def clear_default_text(event):
message = message_entry.get(1.0, tk.END)
ask = "Ask me anything..."
if ask in message:
message_entry.delete(1.0, tk.END)
def send_message(event=None):
message = message_entry.get(1.0, "end-1c")
message = message.strip()
message_entry.delete(1.0, tk.END)
if not message:
pass
else:
time.sleep(5)
root = tk.Tk()
root.title("Chat")
# Maximize the window
root.attributes('-zoomed', True)
style = ttk.Style()
style.theme_use("clam")
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.insert(0, "Ask me anything...")
message_entry.insert(1.0, "Ask me anything...")
message_entry.mark_set("insert", "%d.%d" % (0,0))
message_entry.bind("<Key>", clear_default_text) # Bind the Key event
message_entry.bind("<Return>", send_message)
#message_entry.bind("<Button-1>", click)
message_entry.focus_set()
root.mainloop()






Добавьте эту строку после message_entry.delete(1.0, tk.END):
message_entry.update()
Вместо update_idletasks можно использовать update.
Изменения состояния виджета Tkinter не имеют немедленного видимого эффекта. Состояние обновляется только тогда, когда управление возвращается в основной цикл. По сути,
time.sleep()совершенно не место в программе Tkinter, так как он просто блокирует графический интерфейс на время.