Tkinter. Как прокрутить Treeview к нужному элементу?

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 648
472
83
Доброго времени суток. Есть treeview и есть поиск, который выделяет найденную информацию. Как сделать чтобы treeview прокрутился к искомому элементу, который выделился? Спасибо
Python:
import tkinter as tk
from tkinter import ttk
tree_info = [('bc2e13898123', '127.0.0.1', 'asdasdakkkk', 'True', '21:25 06-10-2020'),
             ('bc2e13898128', 'None', 'asdasda', 'False', 'None'),
             ('bc2e13898125', 'None', 'asdasda', 'False', 'None',),
             ('bc2e13898124', '127.0.0.1', '456', 'True', '10:22 06-10-2020'),
             ('bc2e13898126', '127.0.0.1', 'Не_установлено', 'True', '18:54 07-10-2020'),
             ('bc2e13898121', 'None', 'Не_установлено', 'False', 'None'),
             ('bc2e13898122', 'None', 'Не_установлено', 'False', 'None'),
             ('bc2e13898127', 'None', 'Не_установлено', 'False', 'None'),
             ('bc2e13898128', 'None', 'Не_установлено', 'False', 'None'),
             ('bc2e13898129', 'None', 'Не_установлено', 'False', 'None'),
             ('bc2e13898110', 'None', 'Не_установлено', 'False', 'None'),
             ('bc2e13898111', 'None', 'Не_установлено', 'False', 'None'),
             ('bc2e13898112', 'None', 'Не_установлено', 'False', 'None'),
             ('bc2e13898113', 'None', 'Не_установлено', 'False', 'None'),
             ('bc2e13898114', 'None', 'Не_установлено', 'False', 'None'),
             ('bc2e13898115', 'None', 'Не_установлено', 'False', 'None'),
             ('bc2e13898116', 'None', 'Не_установлено', 'False', 'None'),
             ('bc2e13898117', 'None', 'Не_установлено', 'False', 'None'),
             ('bc2e13898118', 'None', 'Не_установлено', 'False', 'None'),
             ('bc2e13898119', 'None', 'Не_установлено', 'False', 'None'),
             ('bc2e13898120', 'None', 'Не_установлено', 'False', 'None'),
             ('bc2e13898131', 'None', 'Не_установлено', 'False', 'None'),
             ('bc2e13898132', 'None', 'Не_установлено', 'False', 'None'),
             ('bc2e13898133', 'None', 'Не_установлено', 'False', 'None'),
             ('bc2e13898134', 'None', 'Не_установлено', 'False', 'None'),
             ('bc2e13898135', 'None', 'Не_установлено', 'False', 'None'),
             ('bc2e13898136', 'None', 'Не_установлено', 'False', 'None'),
             ('bc2e13898137', 'None', 'Не_установлено', 'False', 'None'),
             ('bc2e13898138', 'None', 'Не_установлено', 'False', 'None'),
             ('bc2e13898139', 'None', 'Не_установлено', 'False', 'None'),
             ('bc2e13898140', 'None', 'Не_установлено', 'False', 'None')]

def tree_insert():
    count = 1
    for i in tree_info:
        tree.insert('', tk.END, 'item{}'.format(count), value=(i), tag=(i))
        count += 1

#Поиск
def search():
    search_entry_get = search_entry.get()
    id_to_select = ()
    if search_entry_get != '':
        all_tags = root.call(str(tree), "tag", "names")
        tags_to_select = tuple(filter(lambda tag: search_entry_get.lower() in tag.lower(), all_tags))
        for sorted_tag in tags_to_select:
            id_to_select += tree.tag_has(sorted_tag)
    tree.selection_set(id_to_select)

root = tk.Tk()
root.minsize(width=650, height=450)
root.maxsize(width=650, height=450)

# Определение таблицы
tree = ttk.Treeview(root, column=('ID', 'IP', 'Name', 'Confirm', 'Time'))
scrollbar = ttk.Scrollbar(root, orient="vertical", command=tree.yview)
tree.configure(yscrollcommand=scrollbar.set)
tree.column('#0', width=40, anchor='center')
tree.column('ID', width=125, anchor='center')
tree.column('IP', width=125, anchor='center')
tree.column('Name', width=145, anchor='center')
tree.column('Confirm', width=115, anchor='center')
tree.column('Time', width=125, anchor='center')
tree.heading('#0', text='Статус')
tree.heading('ID', text='ID')
tree.heading('IP', text='IP-адрес')
tree.heading('Name', text='Имя')
tree.heading('Confirm', text='Подтверждение')
tree.heading('Time', text='Время получения')

# Кнопки в окне и их местоположение
search_entry = tk.Entry(root, width=90, border=2)
search_button_form = tk.Button(root, text='Поиск', command=search)
tree.place(x=0, y=60, relwidth=1, height=-25, relheight=0.9)
search_entry.place(x=-320, y=17, relx=0.5)
search_button_form.place(x=252, y=16, relx=0.5)
scrollbar.place(x=-18, relx=1, y=79, height=-45, relheight=0.9)

tree_insert()

root.mainloop()
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Можно так, например:
Python:
#Поиск
def search():
    search_entry_get = search_entry.get()
    id_to_select = ()
    if search_entry_get != '':
        all_tags = root.call(str(tree), "tag", "names")
        tags_to_select = tuple(filter(lambda tag: search_entry_get.lower() in tag.lower(), all_tags))
        for sorted_tag in tags_to_select:
            id_to_select += tree.tag_has(sorted_tag)
    tree.selection_set(id_to_select)

    if len(id_to_select) == 1:
        item_count = len(tree.get_children())
        tree.yview_moveto((int(id_to_select[0][4:]) - 1) / item_count)
 
  • Мне нравится
Реакции: regnor

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 648
472
83
Спасибо
 

Форум IT Специалистов