Tkinter Treeview

2024. 3. 10. 17:50GUI/tkinter

요약 : 이 튜토리얼에서는 Tkinter Treeview 위젯과 이를 사용하여 표 형식 및 계층적 데이터를 모두 표시하는 방법에 대해 배웁니다.

Tkinter Treeview 위젯 소개

Treeview 위젯을 사용하면 테이블 형식과 계층 구조 모두에서 데이터를 표시할 수 있습니다. Treeview 위젯을 생성하려면 다음 ttk.Treeview 클래스를 사용합니다.

tree = ttk.Treeview(container, **options)

Treeview 위젯은 항목 목록을 보유합니다. 각 항목에는 하나 이상의 열이 있습니다.

첫 번째 열에는 확장 가능 여부를 나타내는 텍스트와 아이콘이 포함될 수 있습니다. 나머지 열에는 각 행의 값이 포함됩니다.

Treeview의 첫 번째 행은 각 열을 이름으로 식별하는 제목으로 구성됩니다.

Tkinter Treeview를 사용하여 표 형식의 데이터 표시

다음 프로그램은 Treeview 위젯을 사용하여 표 형식의 데이터를 표시하는 방법을 보여줍니다.

In [1]:
import tkinter as tk
from tkinter import ttk
from tkinter.messagebox import showinfo

root = tk.Tk()
root.title('Treeview demo')
root.geometry('620x200')

# define columns
columns = ('first_name', 'last_name', 'email')

tree = ttk.Treeview(root, columns=columns, show='headings')

# define headings
tree.heading('first_name', text='First Name')
tree.heading('last_name', text='Last Name')
tree.heading('email', text='Email')

# generate sample data
contacts = []
for n in range(1, 100):
    contacts.append((f'first {n}', f'last {n}', f'email{n}@example.com'))

# add data to the treeview
for contact in contacts:
    tree.insert('', tk.END, values=contact)


def item_selected(event):
    for selected_item in tree.selection():
        item = tree.item(selected_item)
        record = item['values']
        # show a message
        showinfo(title='Information', message=','.join(record))


tree.bind('<<TreeviewSelect>>', item_selected)

tree.grid(row=0, column=0, sticky='nsew')

# add a scrollbar
scrollbar = ttk.Scrollbar(root, orient=tk.VERTICAL, command=tree.yview)
tree.configure(yscroll=scrollbar.set)
scrollbar.grid(row=0, column=1, sticky='ns')

# run the app
root.mainloop()

 

 

동작 방식.

먼저 tkinter 모듈, ttk 하위 모듈 그리고 tkinter.messagebox에서 showinfofrom을 가져옵니다.

import tkinter as tk
from tkinter import ttk
from tkinter.messagebox import showinfo

둘째, 루트 창을 만들고 제목과 크기를 설정합니다.

root = tk.Tk()
root.title('Treeview demo')
root.geometry('620x200')

셋째, 열의 식별자를 정의합니다.

columns = ('first_name', 'last_name', 'email')

넷째, Tkinter의 Treeview 위젯을 만듭니다.

tree = ttk.Treeview(root, columns=columns, show='headings')

이 코드에서는 columns 옵션에 열을 전달했습니다. show='heading'은 Treeview의 '첫 번째 열(column #0)을 숨깁니다.

show 옵션은 다음 값 중 하나를 허용합니다.

  • 'tree'– 열 #0을 표시합니다.
  • 'heading'– 헤더 행을 표시합니다.
  • 'tree headings'– 열 #0과 머리글 행을 모두 표시합니다. 이것이 기본값입니다.
  • ''– 열 #0이나 머리글 행을 표시하지 않습니다.

다섯째, 열의 제목을 지정합니다.

tree.heading('first_name', text='First Name')
tree.heading('last_name', text='Last Name')
tree.heading('email', text='Email')

여섯째, Treeview에 표시할 튜플 목록을 생성합니다.

contacts = []
for n in range(1, 100):
     contacts.append((f'first {n}', f'last {n}', f'email{n}@example.com'))

일곱째, Treeview 위젯의 insert() 메서드를 사용하여 새 항목을 하나씩 만듭니다.

for contact in contacts:
     tree.insert('', tk.END, values=contact)

여덟째, <> 이벤트를 처리할 함수를 정의합니다. 하나 이상의 항목을 선택하면 프로그램에 메시지 상자가 표시됩니다.

def item_selected(event):
     for selected_item in tree.selection():
         item = tree.item(selected_item)
         record = item['values']
         # show a message
         showinfo(title='Information', message=','.join(record))

tree.bind('<>', item_selected)

아홉째, Treeview 위젯을 루트 창에 배치합니다.

tree.grid(row=0, column=0, sticky='nsew')

열번째, Treeview 위젯에 수직 스크롤 막대를 추가합니다.

# add a scrollbar
scrollbar = ttk.Scrollbar(root, orient=tk.VERTICAL, command=tree.yview)
tree.configure(yscroll=scrollbar.set)
scrollbar.grid(row=0, column=1, sticky='ns')

마지막으로 루트 창을 표시합니다.

root.mainloop()

다음 프로그램도 객체 지향 프로그래밍 접근 방식에서 Treeview 위젯을 사용합니다.

In [5]:
import tkinter as tk
from tkinter import ttk
from tkinter.messagebox import showinfo


class App(tk.Tk):
    def __init__(self):
        super().__init__()

        self.title('Treeview demo')
        self.geometry('620x200')

        self.tree = self.create_tree_widget()

    def create_tree_widget(self):
        columns = ('first_name', 'last_name', 'email')
        tree = ttk.Treeview(self, columns=columns, show='headings')

        # define headings
        tree.heading('first_name', text='First Name')
        tree.heading('last_name', text='Last Name')
        tree.heading('email', text='Email')

        tree.bind('<<TreeviewSelect>>', self.item_selected)
        tree.grid(row=0, column=0, sticky=tk.NSEW)

        # add a scrollbar
        scrollbar = ttk.Scrollbar(self, orient=tk.VERTICAL, command=tree.yview)
        tree.configure(yscroll=scrollbar.set)
        scrollbar.grid(row=0, column=1, sticky='ns')

        # generate sample data
        contacts = []
        for n in range(1, 100):
            contacts.append((f'first {n}', f'last {n}', f'email{n}@example.com'))

        # add data to the treeview
        for contact in contacts:
            tree.insert('', tk.END, values=contact)

        return tree

    def item_selected(self, event):
        for selected_item in self.tree.selection():
            item = self.tree.item(selected_item)
            record = item['values']
            # show a message
            showinfo(title='Information', message=','.join(record))


if __name__ == '__main__':
    app = App()
    app.mainloop()

Treeview 위젯에 항목 추가

Treeview 위젯에 항목(또는 행)을 추가하려면, Treeview 위젯 개체의 insert() 메서드를 사용합니다. 다음 예에서는 항목 목록 끝에 항목을 추가합니다.

tree.insert('', tk.END, values=contact)

목록의 시작 부분에 항목을 추가하려면 tk.END 상수 대신 (0)을 사용합니다.

tree.insert('', 0, values=contact)

다음 프로그램은 Treeview에 항목을 추가하는 방법을 보여줍니다.

In [6]:
import tkinter as tk
from tkinter import ttk


class App(tk.Tk):
    def __init__(self):
        super().__init__()

        self.title('Treeview demo')
        self.geometry('620x200')

        self.tree = self.create_tree_widget()

    def create_tree_widget(self):
        columns = ('first_name', 'last_name', 'email')
        tree = ttk.Treeview(self, columns=columns, show='headings')

        # define headings
        tree.heading('first_name', text='First Name')
        tree.heading('last_name', text='Last Name')
        tree.heading('email', text='Email')

        tree.grid(row=0, column=0, sticky=tk.NSEW)

        # adding an item
        tree.insert('', tk.END, values=('John', 'Doe', 'john.doe@email.com'))

        # insert a the end
        tree.insert('', tk.END, values=('Jane', 'Miller', 'jane.miller@email.com'))

        # insert at the beginning
        tree.insert('', 0, values=('Alice', 'Garcia', 'alice.garcia@email.com'))

        return tree


if __name__ == '__main__':
    app = App()
    app.mainloop()

Treeview에서 항목 삭제

Treeview에서 항목을 삭제하려면 Treeview 개체의 delete() 메서드를 사용합니다. 다음 프로그램은 일부 항목이 포함된 Treeview를 보여줍니다. 항목을 클릭하면 트리에서 해당 항목이 삭제됩니다.

In [7]:
import tkinter as tk
from tkinter import ttk


class App(tk.Tk):
    def __init__(self):
        super().__init__()

        self.title('Treeview demo')
        self.geometry('620x200')

        self.tree = self.create_tree_widget()

    def create_tree_widget(self):
        columns = ('first_name', 'last_name', 'email')
        tree = ttk.Treeview(self, columns=columns, show='headings')

        # define headings
        tree.heading('first_name', text='First Name')
        tree.heading('last_name', text='Last Name')
        tree.heading('email', text='Email')

        tree.grid(row=0, column=0, sticky=tk.NSEW)

        # adding an item
        tree.insert('', tk.END, values=('John', 'Doe', 'john.doe@email.com'))

        # insert a the end
        tree.insert('', tk.END, values=('Jane', 'Miller', 'jane.miller@email.com'))

        # insert at the beginning
        tree.insert('', 0, values=('Alice', 'Garcia', 'alice.garcia@email.com'))

        tree.bind('<<TreeviewSelect>>', self.item_selected)

        return tree

    def item_selected(self, event):
        for selected_item in self.tree.selection():
            self.tree.delete(selected_item)


if __name__ == '__main__':
    app = App()
    app.mainloop()

이 프로그램에서 먼저 항목 선택 이벤트를 바인딩합니다.

tree.bind('<>', self.item_selected)

둘째, 트리에서 선택한 항목을 삭제합니다. 선택한 항목을 얻으려면 Treeview 개체의 selection() 메서드를 사용합니다.

def item_selected(self, event):
     for selected_item in self.tree.selection():
         self.tree.delete(selected_item)

열 사용자 정의

항목의 열 및 앵커 크기를 변경하려면 Treeview 개체의 column() 메서드를 사용할 수 있습니다.

tree.column(size, width, anchor)

다음 예에서는 이름과 성 열의 너비를 100으로 설정하고 이메일을 200으로 설정합니다. 또한 이에 따라 각 열의 항목에 대한 앵커도 설정합니다.

tree.column('first_name', width=100, anchor=tk.W)
tree.column('last_name', width=100, anchor=tk.W)
tree.column('email', width=200, anchor=tk.CENTER)

Tkinter Treeview를 사용하여 계층적 데이터 표시

다음 프로그램은 TreeView 위젯을 사용하여 계층적 데이터를 표시하는 방법을 보여줍니다.

In [9]:
import tkinter as tk
from tkinter import ttk
from tkinter.messagebox import showinfo

# create root window
root = tk.Tk()
root.title('Treeview Demo - Hierarchical Data')
root.geometry('400x200')

# configure the grid layout
root.rowconfigure(0, weight=1)
root.columnconfigure(0, weight=1)


# create a treeview
tree = ttk.Treeview(root)
tree.heading('#0', text='Departments', anchor=tk.W)


# adding data
tree.insert('', tk.END, text='Administration', iid=0, open=False)
tree.insert('', tk.END, text='Logistics', iid=1, open=False)
tree.insert('', tk.END, text='Sales', iid=2, open=False)
tree.insert('', tk.END, text='Finance', iid=3, open=False)
tree.insert('', tk.END, text='IT', iid=4, open=False)

# adding children of first node
tree.insert('', tk.END, text='John Doe', iid=5, open=False)
tree.insert('', tk.END, text='Jane Doe', iid=6, open=False)
tree.move(5, 0, 0)
tree.move(6, 0, 1)

# place the Treeview widget on the root window
tree.grid(row=0, column=0, sticky=tk.NSEW)

# run the app
root.mainloop()

 

동작 방식.

Treeview 위젯 부분에 중점을 두겠습니다.

먼저 Treeview 위젯을 생성하고 제목을 설정합니다.

tree = ttk.Treeview(root)
tree.heading('#0', text='Departments', anchor=tk.W)

이 Treeview 위젯에는 열이 하나만 있습니다.

둘째, TreeView 위젯에 항목을 추가합니다.

tree.insert('', tk.END, text='Administration', iid=0, open=False)
tree.insert('', tk.END, text='Logistics', iid=1, open=False)
tree.insert('', tk.END, text='Sales', iid=2, open=False)
tree.insert('', tk.END, text='Finance', iid=3, open=False)
tree.insert('', tk.END, text='IT', iid=4, open=False)

각 항목은 iid로 식별됩니다. iid을 건너뛰면 삽입 메소드가 자동으로 생성합니다. 이 경우 iid 하위 항목을 추가하려면 명시적인 권한이 필요합니다 .

셋째, insert() 및 move() 메서드를 사용하여 iid가 0인 항목에 두 개의 하위 항목을 추가합니다.

adding children of first node

tree.insert('', tk.END, text='John Doe', iid=5, open=False)
tree.insert('', tk.END, text='Jane Doe', iid=6, open=False)
tree.move(5, 0, 0)
tree.move(6, 0, 1)

마지막으로 Treeview 위젯을 루트 창에 배치하고 표시합니다.

# place the Treeview widget on the root window
tree.grid(row=0, column=0, sticky=tk.NSEW)

# run the app
root.mainloop()

요약

  • Tkinter Treeview 위젯을 사용하여 표 형식 및 계층적 데이터를 모두 표시합니다.

 

'GUI > tkinter' 카테고리의 다른 글

Tkinter Cursors  (0) 2024.03.12
Tkinter Canvas  (0) 2024.03.11
Tkinter Notebook  (0) 2024.03.09
Tkinter Progressbar  (0) 2024.03.08
Tkinter LabelFrame  (0) 2024.03.07