田舎社会人のいろいろ学習記

Python、英語、その他いろいろ

【tkinter.ttk】Treeviewの使い方 【Python】

f:id:vigilantPotato:20210620233406p:plain
階層構造を持つアイテムをツリー表示することができる、Treeviewウィジェットの使い方をまとめた。


【スポンサーリンク】


Treeviewの概要

Treeviewを使用すると、階層構造を持つアイテムをツリー表示することができる。以下、親要素parentの下に、子要素childを表示させる場合の例を示す。

import tkinter
from tkinter import ttk

root = tkinter.Tk()

#Treeview
tree = ttk.Treeview(root)

#親要素の挿入
parent = tree.insert(
    "",                 #最上位は空文字
    "end",              #挿入位置
    text="parent"       #表示する文字列
    )

#子要素の挿入
child = tree.insert(
    parent,             #親要素を指定
    "end",              #挿入位置
    text="child"        #表示する文字列
    )

tree.pack()

root.mainloop()

Treeviewに要素を追加する際は、insertメソッドを使用する。inserメソッドの一つ目の引数を空文字にすると最上位の親要素となり、親要素にするとその子要素が設定される。

f:id:vigilantPotato:20210620232726p:plain

[↑ 目次へ]


【スポンサーリンク】


辞書型アイテムの階層表示

次に、階層構造を持つ辞書型のアイテムを階層表示させる例を示す。

import tkinter
from tkinter import ttk

root = tkinter.Tk()

#階層構造を持つ辞書型アイテム
menu = {
    "Food":["Hamburger", "Beef steak", "Salad"],
    "Softdrink":["Coke", "Cider", "Tea"],
    "Alcohol":["Beer", "Wine", "Cocktail"],
    }

#Treeview
tree = ttk.Treeview(root)


#辞書型アイテムの挿入
for p in menu:  #キーを親要素に設定
    parent = tree.insert(
        "",
        "end",
        text=p,
        )

    for m in menu[p]:   #要素を子要素に設定
        child = tree.insert(
            parent,
            "end",
            text=m,
            )

tree.pack()

root.mainloop()

for文を用いて辞書型アイテムのそれぞれのキーを親要素に、その要素を子要素に設定している。

f:id:vigilantPotato:20210620232844p:plain

[↑ 目次へ]

ファイル・フォルダ名をリスト化して表示

ファイル・フォルダ名をリスト化して表示する例を示す。

import tkinter
from tkinter import ttk
import os


#ファイル・フォルダ名を取得してinsertする関数
def process_directory(parent, path):
    for p in os.listdir(path):
        abspath = os.path.join(path, p)
        child = tree.insert(
            parent,
            "end",
            text=p,
            )

        if os.path.isdir(abspath):  #子要素がある場合は再帰呼び出し
            process_directory(child, abspath)


root = tkinter.Tk()

#Treeview
tree = ttk.Treeview(root)
process_directory("", os.getcwd())
tree.pack()

root.mainloop()

process_directory関数内で、フォルダ・ファイル名の取得及びTreeviewへのinsertを行い、子要素がある場合は再帰呼び出しを行ってその子要素のinsertを実行している。

f:id:vigilantPotato:20210620233138p:plain

[↑ 目次へ]


【スポンサーリンク】