Python Tkinter TreeView — как использовать

Что такое Python Tkinter Treeview

  • Tkinter Treeview относится к иерархическому представлению. Когда у нас есть связь между данными, в этом случае у нас есть Treeview.
  • Python Tkinter Treeview обеспечивает улучшенный вид столбцов данных.
  • Python Tkinter Treeview является производным от модуля tkinter.ttk .
  • При создании Treeview всегда создается один дополнительный столбец. Мы называем этот столбец «столбцом-призраком». Обратите внимание, что это только для нашей справки.

Пример дерева Python Tkinter

Давайте посмотрим на пример дерева tkinter Python .

Код:

from tkinter import *
from tkinter import ttk

ws = Tk()
ws.title('PythonGuides')
ws.geometry('400x300')
ws['bg']='#fb0'

tv = ttk.Treeview(ws)
tv['columns']=('Rank', 'Name', 'Badge')
tv.column('#0', width=0, stretch=NO)
tv.column('Rank', anchor=CENTER, width=80)
tv.column('Name', anchor=CENTER, width=80)
tv.column('Badge', anchor=CENTER, width=80)

tv.heading('#0', text='', anchor=CENTER)
tv.heading('Rank', text='Id', anchor=CENTER)
tv.heading('Name', text='rank', anchor=CENTER)
tv.heading('Badge', text='Badge', anchor=CENTER)

tv.insert(parent='', index=0, iid=0, text='', values=('1','Vineet','Alpha'))
tv.insert(parent='', index=1, iid=1, text='', values=('2','Anil','Bravo'))
tv.insert(parent='', index=2, iid=2, text='', values=('3','Vinod','Charlie'))
tv.insert(parent='', index=3, iid=3, text='', values=('4','Vimal','Delta'))
tv.insert(parent='', index=4, iid=4, text='', values=('5','Manjeet','Echo'))
tv.pack()


ws.mainloop()

Значение изменения дерева Python Tkinter

  • В этом разделе мы узнаем, как изменить значение Python Tkinter Treeview Value .
  • В случае Treeview есть два типа значений.
  • Один из них — это значение заголовка, которое мы видим в верхней части таблицы.
  • Еще одна запись, которую мы видим на столе.
  • чтобы изменить значение заголовка, мы должны изменить его как в столбцах, так и в заголовках. для лучшего понимания мы отметили обе вещи на рисунке ниже.
  • Мы предположили, что хотим изменить значение заголовка с 1 на что-то другое.
  • Чтобы изменить значение записи, мы должны создать функцию, которая изменит значение выбранного элемента в дереве Python Tkinter.
  • В этом разделе мы будем изменять только один элемент записи.
  • tkk.tree.focus возвращает выбранную строку элемента в древовидном представлении. Если ничего не выбрано, возвращается пустая строка («»).
  • ttk.tree.item() принимает tkk.tree.focus в качестве аргумента, за которым следует « значение ». Это вернет все значения в выбранном элементе. Эти значения возвращаются в кортеже .
  • Разберемся в этом на примере, в котором зарплата выбранного сотрудника будет увеличена на 5% от текущей.

Код:

В этом коде обратите внимание на функцию update_item .

  • tv.focus()удерживайте номер строки выбранного элемента в Treeview, а значение для него хранится в переменной с именем selected. Вы можете просмотреть это, используя функцию печати. print(selected).
  • tv.item() принимает 2 аргумента, выбранные и значения. Это означает, что из выбранной строки отображаются все значения. Эти значения будут отображаться в формате кортежа. Это хранится в переменной с именем temp .
  • используя temp[0], temp[1], temp[2] мы можем получить доступ к элементам в кортеже.
  • Переменная sal_up содержит расчет для увеличения заработной платы.
  • Метод tv.item() используется для предоставления новых значений записи.
from tkinter import *
from tkinter import ttk

ws = Tk()
ws.title("PythonGuides")

tv = ttk.Treeview(ws, columns=(1, 2, 3), show='headings', height=8)
tv.pack()

tv.heading(1, text="name")
tv.heading(2, text="eid")
tv.heading(3, text="Salary")

def update_item():
    selected = tv.focus()
    temp = tv.item(selected, 'values')
    sal_up = float(temp[2]) + float(temp[2]) * 0.05
    tv.item(selected, values=(temp[0], temp[1], sal_up))

tv.insert(parent='', index=0, iid=0, values=("vineet", "e11", 1000000.00))
tv.insert(parent='', index=1, iid=1, values=("anil", "e12", 120000.00))
tv.insert(parent='', index=2, iid=2, values=("ankit", "e13", 41000.00))
tv.insert(parent='', index=3, iid=3, values=("Shanti", "e14", 22000.00))

Button(ws, text='Increment Salary', command=update_item).pack()

style = ttk.Style()
style.theme_use("default")
style.map("Treeview")

ws.mainloop()

В этом выводе отображается Python Tkinter Treeview . У нас есть образцы данных о сотрудниках. Кнопка внизу содержит функцию увеличения заработной платы выбранного сотрудника на 5%. Шанти проделала отличную работу, она заслуживает повышения. Ее предыдущая зарплата была 22000, после применения надбавки на 5% она стала 23100.

Полосы прокрутки Python Tkinter в виде дерева

Полосы прокрутки — сложный термин для начинающих и один из широко используемых виджетов, который вы не можете игнорировать. Итак, в этом разделе Python Tkinter Treeview мы научимся создавать полосы прокрутки для Treeview.

  • Лучшей практикой реализации полосы прокрутки является использование виджета фрейма.
  • Виджет Frame может содержать другие виджеты. Итак, мы разместим на фрейме виджеты Treeview и полосы прокрутки.
  • команда для создания полосы прокрутки:sb = Scrollbar(frame, orient=VERTICAL)
    • мы помещаем этот виджет в рамку
    • ориентация определяет, будут ли полосы прокрутки горизонтальными или вертикальными .
  • команда для размещения полосы прокрутки на экранеsb.pack(side=RIGHT, fill=Y)
    • Treeview будет упакован в LEFT , а полосы прокрутки – в RIGHT .
    • fill=Yзаполнит полосу прокрутки в доступном пространстве. Это заставит полосу прокрутки выглядеть больше, чем ее фактический размер.
  • Настройка или привязка полосы прокрутки к Treeview — самый важный шаг.
    • tv.config(yscrollcommand=sb.set)эта команда настраивает Treeview и связывает его с полосой прокрутки.
    • sb.config(command=tv.yview)эта команда настраивает полосу прокрутки и связывает ее с Treeview.

Таким образом, мы можем реализовать полосу прокрутки с помощью Treeview. Так как мы использовали фрейм здесь, этот метод может быть реализован на любом виджете, и вы избавите себя от путаницы. Надеюсь, вы поняли, как использовать полосы прокрутки в Python Tkinter Treeview. У нас также есть небольшое приложение с реализацией полосы прокрутки.

Примечание. Если вы правильно реализовали полосу прокрутки, но по-прежнему не отображаются должным образом, увеличьте количество строк в данных. 

Код:

В этом коде мы перенесли предыдущее приложение предоставления приращения сотрудникам. Но на этот раз у нас больше сотрудников. Поскольку экрана недостаточно для отображения всех данных, мы использовали полосы прокрутки.

from tkinter import *
from tkinter import ttk

ws = Tk()
ws.title("PythonGuides")


frame = Frame(ws)
frame.pack(pady=20)

tv = ttk.Treeview(frame, columns=(1, 2, 3), show='headings', height=8)
tv.pack(side=LEFT)

tv.heading(1, text="name")
tv.heading(2, text="eid")
tv.heading(3, text="Salary")

sb = Scrollbar(frame, orient=VERTICAL)
sb.pack(side=RIGHT, fill=Y)

tv.config(yscrollcommand=sb.set)
sb.config(command=tv.yview)

def update_item():
    selected = tv.focus()
    temp = tv.item(selected, 'values')
    sal_up = float(temp[2]) + float(temp[2]) * 0.05
    tv.item(selected, values=(temp[0], temp[1], sal_up))

tv.insert(parent='', index=0, iid=0, values=("vineet", "e11", 1000000.00))
tv.insert(parent='', index=1, iid=1, values=("anil", "e12", 120000.00))
tv.insert(parent='', index=2, iid=2, values=("ankit", "e13", 41000.00))
tv.insert(parent='', index=3, iid=3, values=("Shanti", "e14", 22000.00))
tv.insert(parent='', index=4, iid=4, values=("vineet", "e11", 1000000.00))
tv.insert(parent='', index=5, iid=5, values=("anil", "e12", 120000.00))
tv.insert(parent='', index=6, iid=6, values=("ankit", "e13", 41000.00))
tv.insert(parent='', index=7, iid=7, values=("Shanti", "e14", 22000.00))
tv.insert(parent='', index=8, iid=8, values=("vineet", "e11", 1000000.00))
tv.insert(parent='', index=9, iid=9, values=("anil", "e12", 120000.00))
tv.insert(parent='', index=10, iid=10, values=("ankit", "e13", 41000.00))
tv.insert(parent='', index=11, iid=11, values=("Shanti", "e14", 22000.00))

Button(
    ws, 
    text='Increment Salary', 
    command=update_item, 
    padx=20, 
    pady=10, 
    bg='#081947', 
    fg='#fff', 
    font=('Times BOLD', 12)
    ).pack(pady=10)

style = ttk.Style()
style.theme_use("default")
style.map("Treeview")

ws.mainloop()

В этом выводе данные отображаются в дереве Python Tkinter. Вы можете увидеть полосу прокрутки, добавленную в окно. Неважно, сколько данных в него добавлено, но его можно просмотреть, прокручивая окно.

Python Tkinter TreeView Вставка

метод экземпляра tkinter.ttk.Treeview Создает новый элемент и возвращает идентификатор вновь созданного элемента.

Синтаксис :

insert(parent, index, iid=None, **kw)
  • parent  это идентификатор родительского элемента или пустая строка для создания нового элемента верхнего уровня.
  • index является целым числом или конечным значением, указывающим , в какой список дочерних элементов родителя вставить новый элемент. Если индекс меньше или равен нулю, новый узел вставляется в начало, а если индекс больше или равен текущему количеству дочерних элементов, он вставляется в конец.
  • iid используется как идентификатор элемента, iid не должен уже существовать в дереве. В противном случае генерируется новый уникальный идентификатор.

Выбор дерева Python Tkinter

  • Выбор в Python Tkinter Treeview возвращает кортеж выбранных элементов.
  • Метод Selection возвращает индекс строки выбранных элементов в Treeview.
  • Он может возвращать более одного индекса одновременно в формате кортежа.
  • Выбор полезен во многих отношениях, значение выбора можно сохранить в переменной, а затем с помощью if-else его можно поставить в условие.
  • Зная строку, можно получить доступ к элементам этой строки или изменить их, указав порядковый номер.
  • пример: строка[3], строка[1], строка[2]

Код:

В этом коде обратите внимание на функцию show_selected() . здесь print(tv.selection())печатает выбранную строку.

from tkinter import *
from tkinter import ttk

def show_selected():
    print(tv.selection())

ws = Tk()
ws.title('PythonGuides')

tv = ttk.Treeview(
    ws, 
    columns=(1, 2, 3), 
    show='headings', 
    height=3
    )
tv.pack()

tv.heading(1, text='roll number')
tv.heading(2, text='name')
tv.heading(3, text='class')

tv.insert(parent='', index=0, iid=0, values=(21, "Krishna", 5))
tv.insert(parent='', index=1, iid=1, values=(18, "Bhem", 3))
tv.insert(parent='', index=2, iid=2, values=(12, "Golu", 6))
tv.insert(parent='', index=3, iid=3, values=(6, "amul", 3))
tv.insert(parent='', index=4, iid=4, values=(12, "nestle", 6))
tv.insert(parent='', index=5, iid=5, values=(6, "zebronics", 3))

style = ttk.Style()
style.theme_use("default")
style.map("Treeview")


Button(ws, text="Show Selected", command=show_selected).pack()

ws.mainloop()

В этом выводе сначала мы выбрали один и нажали кнопку. поэтому в выводе мы можем заметить ('1',). Это означает, что выбрана строка по индексу 1. Теперь, когда мы выбрали две строки и нажали кнопку, она дала нам, ('1', '2')что означает, что строки с индексом 1 и индексом 2 выбраны, как мы можем видеть на рисунке.

Ширина дерева Python Tkinter

В этом разделе Python Tkinter Treeview мы узнаем, как реализовать ширину в Treeview.

  • Ширина — это горизонтальная длина каждого столбца в дереве.
  • Изменение ширины приведет к изменению горизонтального пространства приложения.
  • Ширина объявляется в разделе столбца. Это не обязательная опция.
  • по умолчанию каждый столбец имеет ширину 20 пикселей.

Таблица дерева Python Tkinter

  • Python Tkinter Treeview — это табличное представление данных, поскольку оно обладает всеми свойствами таблицы.
  • Treeview имеет строки, столбцы и заголовок.
    • rows : горизонтальное пространство, определяемое данными. Больше данных, больше строк.
    • столбцы : вертикальное пространство определяет заголовок. Больше заголовков, больше столбцов.
    • заголовок : Заголовок находится в верхней строке.

Высота дерева Python Tkinter

В этом разделе Python Tkinter Treeview мы узнаем, как реализовать высоту.

  • Высота — это вертикальная длина Treeview.
  • Он также определяет количество строк в Treeview.
  • Изменение высоты приведет к изменению количества строк, отображаемых на экране.

Синтаксис:

tv = ttk.Treeview(ws, columns=(1, 2, 3), show='headings', height=3)
tv.pack(side=LEFT)

Код:

В этом коде мы установили высоту = 5 , что означает, что будут отображаться только 5 строк. Мы также пробовали height=3 . Итак, вы пытаетесь изменить эти значения.

from tkinter import *
from tkinter import ttk

ws = Tk()
ws.title('PythonGuides')

tv = ttk.Treeview(
    ws, 
    columns=(1, 2, 3), 
    show='headings', 
    height=5
    #height=3
    )
tv.pack()

tv.heading(1, text='roll number')
tv.heading(2, text='name')
tv.heading(3, text='class')

tv.insert(parent='', index=0, iid=0, values=(21, "Krishna", 5))
tv.insert(parent='', index=1, iid=1, values=(18, "Bhem", 3))
tv.insert(parent='', index=2, iid=2, values=(12, "Golu", 6))
tv.insert(parent='', index=3, iid=3, values=(6, "amul", 3))
tv.insert(parent='', index=4, iid=4, values=(12, "nestle", 6))
tv.insert(parent='', index=5, iid=5, values=(6, "zebronics", 3))

style = ttk.Style()
style.theme_use("default")
style.map("Treeview")

ws.mainloop()

В этом выводе отображаются два изображения. Первое изображение имеет высоту=5 , а второе изображение имеет высоту=3 .

Режим выбора Python Tkinter TreeView

В этом разделе мы поймем, что такое Selectmode и типы Selectmode в Python Tkinter Treeview.

  • Selectmode управляет тем, как встроенные привязки классов управляют выбором. Есть три способа сделать это:
    • расширенный: позволяет пользователю выбирать несколько элементов.
    • просматривать: позволяет выбрать только один элемент за раз.
    • нет: выбор не будет изменен, пользователь щелкнет, но ничего не будет выбрано.

Синтаксис:

вместо « none » можно указать « расширенный » или «просмотреть» в соответствии с использованием.

tv = Treeview(ws, selectmode="none")
tv.pack()

Код:

В этом коде мы реализовали все три метода Python Tkinter Selectmode. Мы выделили три кнопки, каждая из которых выполняет свою задачу.

  • Когда ни одна кнопка не нажата, пользователь не увидит никаких маркировок в дереве.
  • При нажатии кнопки обзора пользователь сможет выбрать один элемент за раз.
  • При нажатии расширенной кнопки пользователь сможет выбрать несколько элементов одновременно.
  • нажмите и удерживайте клавишу Shift на клавиатуре, чтобы выбрать несколько элементов.
from tkinter import *
from tkinter import ttk


def selectmode_none():
    tv['selectmode']="none"

def selectmode_browse():
    tv['selectmode']="browse"

def selectmode_extended():
    tv['selectmode']="extended"

ws = Tk()

tv = ttk.Treeview(
    ws, 
    columns=(1, 2, 3), 
    show='headings', 
    height=8
    )
tv.pack()

tv.heading(1, text='roll number')
tv.heading(2, text='name')
tv.heading(3, text='class')

tv.insert(parent='', index=0, iid=0, values=(21, "Krishna", 5))
tv.insert(parent='', index=1, iid=1, values=(18, "Bhem", 3))
tv.insert(parent='', index=2, iid=2, values=(12, "Golu", 6))
tv.insert(parent='', index=3, iid=3, values=(6, "Priya", 3))


b1 = Button(
    ws, 
    text="Browse",
    pady=20,
    command=selectmode_browse
    )
b1.pack(side=LEFT, fill=X, expand=True)


b2 = Button(
    ws, 
    text="None",
    pady=20,
    command=selectmode_none
    )
b2.pack(side=LEFT, fill=X, expand=True)


b3 = Button(
    ws, 
    text="Extended",
    pady=20,
    command=selectmode_extended
    )
b3.pack(side=LEFT, fill=X, expand=True)

style = ttk.Style()
style.theme_use("default")
style.map("Treeview")

ws.mainloop()

В этом выводе отображается простое приложение Python Tkinter Treeview . Внизу есть три кнопки, которые изменяют режим выбора древовидного списка.