Очистить текст Tkinter Entry - новый текст выглядит новым?
Я хочу изменить приведенный ниже код, чтобы очистить текст записи до написания нового текста. В основном я хочу удалить текст, подождать одну секунду, а затем написать новый текст. Это должно создать видимость написанного "НОВОГО" текста. Есть идеи? ТИА - Брэд
import thread, Queue, time, random, poster
from Tkinter import *
dataQueue = Queue.Queue()
def status(t):
try:
data = dataQueue.get(block=False)
except Queue.Empty:
pass
else:
t.delete(0, END)
time.sleep(1)
t.insert(0, '%s\n' % str(data))
t.after(2, lambda: status(t))
def makethread():
thread.start_new_thread(poster.poster, (1,dataQueue))
if __name__ == '__main__':
root = Tk()
root.geometry("240x45")
t = Entry(root)
t.pack(side=TOP, fill=X)
Button(root, text='Start Epoch Display',
command=makethread).pack(side=BOTTOM, fill=X)
status(t)
root.mainloop()
В другом файле под названием poster
import random, time
def poster(id,que):
while True:
delay=random.uniform(5, 10)
time.sleep(delay)
que.put(' epoch=%f, delay=%f' % (time.time(), delay))
2 ответа
Сделал эти изменения, и это работает... Спасибо @anonakos. Смотрите мои комментарии к его ответу.
Main code:
else:
t.delete(0, END)
time.sleep(1)
t.insert(0, '%s\n' % str(data))
t.after(2, lambda: status(t))
Poster code:
def poster(id,que):
while True:
delay=random.uniform(5, 10)
time.sleep(delay-0.5)
que.put(' ')
time.sleep(.5)
que.put(' epoch=%f, delay=%f' % (time.time(), delay))
Поскольку в очередь потенциально записывается много потоков (по одному при каждом нажатии кнопки), немного неясно, когда следует удалять текст и вставлять новый. Например, если текст только что написан и новый текст поступает, должен ли новый текст быть записан немедленно или он должен быть добавлен в очередь для последующего отображения, как позволяет время?
Вы можете настроить обработчик состояния для обработки команд удаления, а также вставки команд. Эта версия обработчика запускает поток после каждой вставки, которая отправляет обратно команду удаления. Если идентификатор команды удаления совпадает с идентификатором отображаемого в данный момент текста, то обработчик состояния стирает отображение:
def status(t, current_id, queue):
try:
data = queue.get(block = False)
# Insert text for ID command:
if type(data) == tuple:
(id, str) = data
t.delete(0, END)
t.insert(0, str)
current_id = id
# Thread that sends a delete command
# after a fixed delay.
make_delete_thread(id, queue)
# Delete text for ID command:
elif data == current_id:
t.delete(0, END)
except Queue.Empty:
pass
t.after(10, lambda: status(t, current_id, queue))
def make_delete_thread(id, queue):
thread.start_new_thread(delete_thread, (id, queue))
def delete_thread(id, queue):
time.sleep(1)
queue.put(id)