- Виджет Treeview. Создание таблиц и деревьев
- Управление данными
- Добавление элементов
- Удаление элементов
- Перемещение элементов
- Получение элементов
- Изменение значений
- Python Tkinter Treeview
- show option: trv[‘show’] = ‘tree’
- Parent-child node
- Getting list of data from Treeview
- On select event of treeview
- Displaying selected item value
- Adding Buttons to move UP or DOWN the row selection
- Edit and update selected item value
- Reading all rows of Treeview
- Delete all items ( rows ) of Treeview
- Options of Treeview
- Wrapping text
- Adding scrollbar to Treeview
- Adding horizontal Scrollbar
- Using Google sheets data with Treeview
- Using Excel data with Treeview
Виджет Treeview. Создание таблиц и деревьев
Виджет Treeview предназначен для отображения иерархических данных, причем как в виде дерева, так и в виде таблицы. Среди параметров Treeview следует отметить следующие:
- columns : столбцы таблицы в виде строки или списка/кортежа строк
- displaycolumns : отображаемые столбцы таблицы
- cursor : курсор при наведении на виджет
- height : высота виджета
- padding : отступы от границ виджета до содержимого
- selectmode : режим выбора элементов в виджете
- show : формат отображения данных. Может принимать одно из следующих значений:
- tree : отображает столбец #0
- heading : отображает строку с заголовками
- tree headings : отображает столбец #0 и строку с заголовками
- «» : не отображает ни столбец #0, ни строку с заголовками
Управление данными
Добавление элементов
Для добавления данных применяется метод insert() :
insert: (parent, index, iid, values) -> str
Этот метод создает новый элемент и возвращает его идентификатор, который по умолчанию представляет строку наподобие «IOO1». Основные параметры метода:
- parent : представляет идентификатор родительского элемента, в который добавляется элемент. Если создается элемент верхнего уровня, для которого не существует никакого родительского элемента, как, например, в случае с добавлением строки в таблицу, то передается пустая строка.
- index : указывает индекс для вставки элемента. Если элемент добавляется в конец, то используется значение END или «end» , либо указывается число, которое равно количеству элементов или больше его. Если элемент добавляется в самое начало, то указывается 0 или число меньше нуля.
- iid : если указан данный параметр, то его значение будет использоваться в качестве идентификатора элемента. При этом подобный в виджете не должно быть элемента с подобным идентификатором, иначе генерируется новый идентификатор, как в обшем случае
- values : список или кортеж значений, которые и составляют добавляемый элемент
Удаление элементов
Для удаления данных применяется метод delete() :
В качестве параметра метод принимает удаляемые данные
Перемещение элементов
Для перемещения элемента на другую позицию применяется метод move() :
Этот метод создает новый элемент и возвращает его идентификатор, который по умолчанию представляет строку наподобие «IOO1». Основные параметры метода:
- item : идентификатор элемента, который надо переместить.
- parent : представляет родительский элемент перемещаемого элемента .
- index : индекс, на который перемещается элемент
Получение элементов
Для получения элементов применяется метод get_children() :
Он принимает идентификатор элемента, дочерние элементы которого надо получить, и возвращает набор идентификаторов полученных элементов:
for k in treeview.get_children(""): print(k)
В данном случае k представляет идентификатор элемент.
В качестве параметра в get_children() передается элемент в Treeview, дочерние элементы которого мы хотим получить. Если надо получить элементы верхнего уровня (например, строки таблицы), то передается пустая строка.
Конкретный элемент по ключу с помощью метода item() , в который передается идентификатор элемента:
for k in treeview.get_children(""): print(treeview.item(k))
в данном случае treeview.item(k) возвратит набор значений элемента в Treeview (например, всю строку).
Если нам надо получить не весь набор значений, а только одно значение (отдельную ячейку строки), то применяется метод set() , в который передается идентификатор элемента и номер столбца:
for k in treeview.get_children(""): print(treeview.set(k, 0))
В данном случае получаем значение первой ячейки строки (при табличном отображении).
Изменение значений
Если надо изменить один столбец, то применяется метод set()
- item : идентификатор элемента, который надо изменить.
- column : индекс элемента в кортеже (столбца в строке), который надо изменить.
- value : новое значение
Здесь значение в первом столбце элемента с меняется на строку «Admin»
Если надо изменить вообще весь элемент со всеми его значениями, то применяется метод item()
- item : идентификатор элемента, который надо изменить.
- values : кортеж с новыми значениями
treeview.item("I003", values=("Tim", 34, "tim@email.com"))
Здесь элемент с в качестве значений принимает кортеж («Tim», 34, «tim@email.com»)
В следующих статьях рассмотрим применение этих методов.
Python Tkinter Treeview
ttk.Treeview displays a hierarchical collection of items and also displays tabular data. We can add child node so can create a view which can be expanded.
Tkitner Treeview to get Parent Child nodes and display data in hierarchical order
Here is a basic Treeview with tree.
from tkinter import ttk import tkinter as tk # Creating tkinter my_w my_w = tk.Tk() my_w.geometry("260x280") my_w.title("www.plus2net.com") # Using treeview widget trv = ttk.Treeview(my_w, selectmode ='browse') trv.grid(row=1,column=1,padx=30,pady=20) # column identifiers trv["columns"] = ("1", "2") # Defining headings, other option is tree trv['show'] = 'tree' # width of columns and alignment trv.column("#0", width = 80, anchor ='c') trv.column("1", width = 10, anchor ='c') trv.column("2", width = 100, anchor ='c') # Headings # respective columns trv.heading("#0", text ="Label",anchor='c') trv.heading("1", text ="id") trv.heading("2", text ="Name",anchor='c') trv.insert("",'end',iid=1,text='First',values=(1,'n1-Alex')) trv.insert("",'end',iid=2,text='second',values=(2,'n2-Ravi')) trv.insert("",'end',iid=3,text='third',values=(3,'n3-Ronn')) my_w.mainloop()
Watch the column with #0, this column will display in Tree and show the text part given in each row. The line saying trv[‘show’] = ‘tree’ can take the value as headings trv[‘show’] = ‘headings’ and the column with #0 will be hidden.
show option: trv[‘show’] = ‘tree’
headings : Show the headings without the column marked as #0
tree : Show tree view with expanding the child node. No header row.
tree headings : (Default) Show both heading and expanding child node.
» : Neither tree view nor headings are shown.Parent-child node
Getting list of data from Treeview
my_list=[] for child in trv.get_children(): my_list.append(trv.item(child)["values"][1]) #print(trv.item(child)["values"]) #print(trv.item(child)["values"][1]) # for Name print(my_list)
On select event of treeview
def data_collect(): print("hi") p_id = trv.selection()[0] # collect selected row id trv.bind(">", data_collect())
Displaying selected item value
def show(): p_id = trv.selection()[0] # collect selected row id print(trv.item(p_id)) # Dictionary of all options print(trv.item(p_id)['values']) # List of values b1=tk.Button(my_w,text='Show',command=show) b1.grid(row=2,column=1)
Adding Buttons to move UP or DOWN the row selection
from tkinter import ttk import tkinter as tk my_w = tk.Tk() my_w.geometry("450x380") # width and height of window my_w.title("www.plus2net.com") # title of the window i=0 def my_move(direction): global i if(direction=='Up'): # Up button is clicked i=int(i)-1 else: i=int(i)+1 trv.selection_set(i) bt1=tk.Button(my_w,text='Up',command=lambda:my_move('Up')) bt1.grid(row=1,column=0,padx=5,pady=10) bt2=tk.Button(my_w,text='Down',command=lambda:my_move('Down')) bt2.grid(row=1,column=1,padx=5,pady=10) trv=ttk.Treeview(my_w,selectmode='browse',show='headings') trv.grid(row=2,column=0,columnspan=3,padx=30,pady=10) # column identifiers trv["columns"] = ("1", "2","3","4") trv.column("1", width = 50, anchor ='w') trv.column("2", width = 150, anchor ='c') trv.column("3", width = 100, anchor ='c') trv.column("4", width = 70, anchor ='c') trv.heading(1, text ="id",anchor='w') trv.heading(2, text ="Name",anchor='c') trv.heading(3, text ="Class",anchor='c') trv.heading(4, text ="Mark",anchor='c') trv.insert("",'end',iid=1,values=(1,'Alex1','Four',78)) trv.insert("",'end',iid=2,values=(2,'Alex2','Four',80)) trv.insert("",'end',iid=3,values=(4,'Alex3','Four',78)) trv.insert("",'end',iid=4,values=(5,'Alex4','Five',80)) trv.insert("",'end',iid=5,values=(6,'Alex5','Sixr',40)) trv.insert("",'end',iid=6,values=(7,'Alex6','Four',70)) trv.insert("",'end',iid=7,values=(8,'Alex7','Three',50)) #trv.selection_set('b') #p_id=trv.selection()[0] #print(p_id) def data_collect(*args): global i i=trv.selection()[0] #iid value of the selection print(i) trv.bind(">",data_collect) # On select event or row my_w.mainloop()
Edit and update selected item value
Here only the Name column data we will select and update. We kept one button to show the selected node value and another button to Update the name of the selected node.
def show(): p_id = trv.selection()[0] # collect selected row id print(trv.item(p_id)) # Dictionary of all options print(trv.item(p_id)['values']) # List of values def upd(): p_id = trv.selection()[0] # collect selected row id trv.item(p_id, values=[trv.item(p_id)['values'][0],e1.get()]) b1=tk.Button(my_w,text='Show',command=show) b1.grid(row=2,column=2) e1=tk.Entry(my_w) e1.grid(row=3,column=1) b1=tk.Button(my_w,text='Update',command=upd) b1.grid(row=3,column=2)
Reading all rows of Treeview
for line in trv.get_children(): print(trv.item(line)['values'])
Delete all items ( rows ) of Treeview
get_children() returns the list of children belonging to item. If item is not specified, returns root children.
Here we are removing all rows.for item in trv.get_children(): trv.delete(item)
trv.delete(*trv.get_children())# delete all rows from treeview
Options of Treeview
Options Details columns Column identifier strings. These are in addition to the icon column cursor Shape of the cursor when mouse is over it. A list of available cursor shapes are here. displaycolumns Select columns to be displayed and the order height Number of rows ( default value is 10 ). padding Extra space around the data inside the widget selectmode browse | extend | none ,
browse : Select one item only
extend : Select more than one item
none : No selectiontakefocus True | False , specify whether the widget is visited during focus traversal Wrapping text
We have imported textwrap module. Added style to give the rowheight and created one function to wrap the text.
from tkinter import * from tkinter import ttk import textwrap def wrap(string, length=20): return '\n'.join(textwrap.wrap(string, length)) my_w = Tk() trv = ttk.Treeview(my_w, height=3) trv['show'] = 'headings' s = ttk.Style() s.configure('Treeview', rowheight=60) trv["columns"] = ("1", "2") trv.column("1", width=100) trv.column("2", width=100) trv.heading("1", text="col 1") trv.heading("2", text="col 2") item = trv.insert("", "end", values=(wrap("This is long text,i want to wrap"), wrap("and this text also length is more"))) item = trv.insert("", "end", values=("No wrap","No Wrap")) trv.grid(row=0, column=0) my_w.mainloop()
Output is here.
Adding scrollbar to Treeview
Since Treeview is used to show tabular data, we may have to show more rows by allowing the user to scroll up or down by using scrollbar.
vs = ttk.Scrollbar(my_w,orient="vertical", command=trv.yview)#V Scrollbar trv.configure(yscrollcommand=vs.set) # connect to Treeview vs.grid(row=1,column=2,sticky='ns')
Adding horizontal Scrollbar
trv.column(i, anchor ='c', width=20,stretch = False)
hs = ttk.Scrollbar(my_w,orient="horizontal", command=trv.xview)#H Scrollbar trv.configure(xscrollcommand=hs.set) # connect to Treeview hs.grid(row=2,column=1,sticky='ew')
Using Google sheets data with Treeview
We can collect data from google sheet and use as data for a Treeview by using pygsheets library and google drive API.
Data of Treeview from Google sheet data »Using Excel data with Treeview
We can collect data from MS Excel by using openpyxl library and use as data for a Treeview
Excel Data to create Treeview »plus2net.com
Python programming Basics ⇩