【Python】tkinter:ファイル・フォルダを階層表示する(ttk.Treeview)

時計 2021.10.22 / 時計

【Python】tkinter:ファイル・フォルダを階層表示する(ttk.Treeview)

本記事ではPythonのtkinterで、ファイル・フォルダ階層表示する方法について解説していきます。

数あるTkinterウィジェットの一つ、Treeviewを使用することでテーブル(表)や階層表示を作成することができます。

ここでいう階層表示とは、エクスプローラーで表示されているフォルダツリーのようなものです。

tkinterで作成するGUIアプリケーションによっては、アイテムを階層表示したい場面があります。例えばパソコン内のファイルやフォルダ一覧を表示したいときです。

本記事を通してttk.Treeviewウィジェットを利用した、アイテムを階層表示する方法を確認してください。

tkinterの基本的な操作方法を知りたい方は以下記事をご参照ください。

Treeviewウィジェット

Pythonの標準ライブラリに含まれるTkinterは、PythonでGUIアプリケーションを作成する際に利用されるデフォルトスタンダードのライブラリです。

TkinterにはGUI画面を作成するためのパーツとして19種類のウィジェット、そしてttkにプラス6種類、計25種類のウィジェットが存在します。

豊富に用意されているウィジェットの中で、本記事はttk.Treeviewウィジェットを利用していきます。

ttk.Treeviewウィジェットは階層構造(いわゆるツリー構造)のアイテムを階層表示することができます。

Windowsユーザーだと、エクスプローラーでフォルダの階層構造をよく目にしているかと思います。

エクスプローラーの階層構造

Windowsのエクスプローラーのようにフォルダツリーをtkinterで実現するには、Treeviewウィジェットを利用します。

Treeviewウィジェットはその他に、テーブル(表)を簡単に作成することができます。
テーブルの作成については別の記事で解説いたします。

ここではエクスプローラーのような階層表示をTreeviewウィジェットで実現します。

以下にTreeviewウィジェットの特徴をまとめます。

  • 階層表示とテーブルを表現できる
  • アイテムのリストを保持し、各アイテムは1つ以上の列を持つ
  • 1行目に見出しを付けることができる

階層表示の基本の流れ

tkinterによる階層表示をするための基本的な流れを解説します。ここでは以下に示すコードを元に解説していきます。

# サンプルコード
import tkinter as tk
from tkinter import ttk

# メインウィンドウの生成
root = tk.Tk()
root.title("Treeview")
# Treeviewの生成
tree = ttk.Treeview(root, show=['tree', 'headings'], height=5)
# 見出しの設定
tree.heading("#0",text="Heading",anchor=tk.CENTER)
# 親要素の挿入
parent = tree.insert("", "end", text="parent", open="True")
office = tree.insert("", "end", text="office")
# 子要素の挿入
child = tree.insert(parent, "end", text="child")
child = tree.insert(office, "end", text="54")
# ウィジェットの配置
tree.pack()

root.mainloop()

上記のサンプルコードを実行すると以下のアプリケーションが起動します。

tkinter:treeviewによる階層表示のサンプルプログラム

Treeviewオブジェクトの生成

以下に示すコンストラクタを使ってTreeviewオブジェクトを生成します。

構文

ttk.Treeview(container, **options)

引数 説明
container 親ウィジェットを指定
options オプションを指定(複数可)

生成したTreeviewオブジェクトを使って、階層表示を作成していきます。以下にTreeviewで指定できるオプション引数の一部を記します。

キーワード引数 説明
columns 列の識別名
displaycolumns 表示する列の指定及び順番
show 表示する対象
・tree:階層列
・headings:見出し)
*デフォルト値は両方(['tree', 'headings'])
selectmode 選択できる要素数
・EXTENDED:複数選択可能(デフォルト)
・BROWSE:一つのみ選択
・NONE:選択不可
height 表示する行数
padding 内部間隔(パディング)の指定
cursor カーソルの指定
style スタイルの指定
xscrollcommand x方向のスクロール呼び出し関数
yscrollcommand y方向のスクロール呼び出し関数

サンプルコードでは次のようにしてTreeviewオブジェクトを生成しています。

tree = ttk.Treeview(root, show=['tree', 'headings'], height=5)

上記ではオプションshowで階層列と見出しの表示を指定し、オプションheightで行数を5にしています。オプションshowはデフォルト値が['tree', 'headings']なので、わざわざ記載する必要はありません。

列の見出しの設定:heading()メソッド

Treeviewオブジェクトを生成する際にオプションshowでheadingsが指定されていると、見出しを指定することができます。

構文

heading(column, options)

引数columnには列名を指定します。Treeviewオブジェクトを生成する際にオプションcolumnsで指定していれば、その列の識別名を指定してください。

列名#0は階層列を表します。

optionsには以下のオプションを指定できます。

オプション名 説明
anchor 文字列の配置
command 紐づける関数を指定
image 見出しの右側に表示する画像
text 見出しのテキスト

サンプルコードでは次のようにして見出しを設定しています。

tree.heading("#0",text="Heading",anchor=tk.CENTER)

親要素・子要素の挿入:insert()メソッド

階層構造を挿入するにはinsert()メソッドを使用します。

構文

insert(parent, index, iid=None, options)

引数parentには親要素を指定します。挿入する要素が最上位の親要素の場合は、空文字を指定します。

引数indexには文字列の挿入位置を指定します。末尾に挿入する場合は、"end"を指定してください。

引数iidは挿入するアイテムのアイテムIDを意味します。iidを省略すると、自動的に生成されます。

insert()メソッドの戻り値はiidです。

optionsには以下のオプションを指定できます。

オプション名 説明
image 画像の指定
open 子要素を展開した状態するか
・False:子要素を展開しない
・True:子要素を展開した状態にする
tags タグ名を指定
text 挿入するテキストを指定
values データ列の値(リスト)

サンプルコードでは次のようにして親要素と子要素を追加しています。

# 親要素の挿入
parent = tree.insert("", "end", text="parent", open="True")
office = tree.insert("", "end", text="office")
# 子要素の挿入
child = tree.insert(parent, "end", text="child")
child = tree.insert(office, "end", text="54")

メソッド一覧

Treeviewオブジェクトに使用できるメソッドの一覧を以下に記します。

メソッド名 説明
heading() 見出しを設定する
insert() 要素を追加する
bbox() 表示している領域(ピクセル単位のタプル)を取得
column() 列を設定
delete() 指定したアイテムを削除(復元不可)
detach() 指定したアイテムを削除(復元可能)
exists() アイテムの存在を確認
focus() フォーカスの設定・取得
get_children() 子要素を取得
item() アイテムからオプションの取得・設定
move() アイテムの移動
next() 指定したアイテムの次のアイテムを取得
parent() 指定した子要素の親要素を取得
selection() 選択アイテムの取得

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

ここでは辞書型のアイテムにTreeviewウィジェットを利用して階層表示します。

以下に辞書型アイテムを階層表示するスクリプトのサンプルコードを記します。

# サンプルコード
import tkinter
from tkinter import ttk

# 階層構造を持つ辞書型アイテム
items = {
    "IT info":["OFFICE365", "VPN", "Programing"],
    "Python":["Django", "Tkinter", "Selenium"],
    }
# メインウィンドウの生成
root = tkinter.Tk()
# Treeviewの生成
tree = ttk.Treeview(root)
# 見出しの設定
tree.heading("#0", text="OFFICE54", anchor=tk.CENTER)
# アイテムの挿入
for parent in items:  #キーを親要素に設定
    parent_element = tree.insert("","end",text=parent, open="True")
    for child in items[parent]:   #要素を子要素に設定
        child_element = tree.insert(parent_element,"end",text=child)
# ウィジェットの配置
tree.pack()

root.mainloop()
tkinter:辞書型のアイテムを階層表示する

パソコン内のフォルダ・ファイルを階層表示する

ここではパソコン内のフォルダ・ファイルをTreeviewウィジェットを利用して階層表示します。

この方法を利用すれば、Windowsのエクスプローラーのようにフォルダツリーを表示できます。

以下にフォルダツリーを表示するスクリプトのサンプルコードを記します。

# サンプルコード
import tkinter
from tkinter import ttk
import os

# ファイル・フォルダ名を挿入する関数
def folder_insert(parent, path):
    for i in os.listdir(path):
        abspath = os.path.join(path, i)
        child = tree.insert(parent,"end",text=i)
        if os.path.isdir(abspath):  #子要素がある場合
            process_directory(child, abspath)
# メインウィンドウの生成
root = tkinter.Tk()
# Treeviewの生成
tree = ttk.Treeview(root)
# 見出しの設定
tree.heading("#0", text="エクスプローラー", anchor=tk.CENTER)
# アイテムの挿入
folder_insert("", "C:\OFFICE54")
# ウィジェットの配置
tree.pack()

root.mainloop()
tkinter:ファイル・フォルダーを階層表示する

スクロールバーを追加する

ここでは階層表示にスクロールバーを追加します。

以下にフォルダツリーにスクロールバーを追加したスクリプトのサンプルコードを記します。

# サンプルコード
import tkinter as tk
from tkinter import ttk
import os

# ファイル・フォルダ名を挿入する関数
def folder_insert(parent, path):
    for i in os.listdir(path):
        abspath = os.path.join(path, i)
        child = tree.insert(parent,"end",text=i, open="True")
        if os.path.isdir(abspath):  #子要素がある場合
            process_directory(child, abspath)
# メインウィンドウの生成
root = tk.Tk()
# Treeviewの生成
tree = ttk.Treeview(root)
# 見出しの設定
tree.heading("#0", text="エクスプローラー", anchor=tk.CENTER)
# アイテムの挿入
folder_insert("", "C:\OFFICE54")
# スクロールバーの追加
scrollbar = ttk.Scrollbar(root, orient=tk.VERTICAL, command=tree.yview)
tree.configure(yscroll=scrollbar.set)
# ウィジェットの配置
tree.pack(side=tk.LEFT)
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)

root.mainloop()
tkinter:階層表示にスクロールバーを追加する

まとめ

本記事「【Python】tkinter:ファイル・フォルダを階層表示する(ttk.Treeview)」はいかがでしたか。

Treeviewウィジェットは階層表示だけでなくテーブル(表)の作成でも利用します。
ぜひ使い方をマスターしてご自身のGUIアプリに使ってください。