Как убирать выделение строки цветом в treeview через какое-то время
Подскажите как сделать при добавлении элемента в таблицу, чтобы он на какое-то время подсвечивался другим цветом? Можно ли обойтись без блокировки time.sleep
и счетчика name_tag
?
from tkinter import *
from tkinter import ttk
import threading
import queue
import time
def get_data(x): # функция которая добавляет елементы в таблицу получая их через очередь
name_tag = x
e.wait()
e.clear()
tree.insert('', 0, values=q.get(), tags=str(name_tag))
q.task_done()
tree.tag_configure(str(name_tag), background='yellow')
time.sleep(0.5)
tree.tag_configure(str(name_tag), background='white')
x += 1 #счетчик для изменения тега
tree.after(2500, get_data(x))
def data(): #функция генератор значений для добавления в строки таблицы
for i in range(100):
q.put(i)
e.set()
time.sleep(2)
q = queue.Queue()
e = threading.Event()
# определяем окно
root = Tk()
root.title("окно")
root.geometry("300x300")
# создаем контейнеры для таблиц
frm = ttk.LabelFrame(root, width=150, height=150, text='Таблица', labelanchor=N)
count = 0
# рисуем контейнеры в окно
frm.place(relx=0, rely=0.1, relwidth=0.5, relheight=0.4)
# создаем таблицы
tree = ttk.Treeview(frm, columns=['header'], show="headings")
# даем названия колонок
tree.heading('header', text='header', anchor=W)
# рисуем таблицы
tree.pack(fill=BOTH, expand=True)
thr_get_data = threading.Thread(target=get_data, args=(count,)).start()
thr_data = threading.Thread(target=data, args=()).start()
# запускаем окно
root.mainloop()
Ответы (1 шт):
Автор решения: insolor
→ Ссылка
Пример полностью через метод .after()
без многопоточности
from tkinter import *
from tkinter import ttk
def clear_mark(tag):
tree.tag_configure(tag, background='white')
def insert_items(i=0):
if i >= 100:
return
name_tag = str(i)
tree.insert('', END, values=i, tags=name_tag)
# Добавляем выделение цветом новой строке
tree.tag_configure(name_tag, background='yellow')
# Планируем удаление выделения цветом у этой строки через 1,5 секунды
root.after(1500, clear_mark, name_tag)
# Планируем выполнение функции вставки через 1 секунду с увеличенным счетчиком
root.after(1000, insert_items, i + 1)
root = Tk()
root.title("окно")
frm = ttk.LabelFrame(root, width=150, height=150, text='Таблица', labelanchor=N)
frm.pack(fill=BOTH, expand=True)
tree = ttk.Treeview(frm, columns=['header'], show="headings")
tree.heading('header', text='header', anchor=W)
tree.pack(fill=BOTH, expand=True)
# Запускаем добавление строк
insert_items()
root.mainloop()