KURORO BLOGのロゴ

このエントリーをはてなブックマークに追加
Tkinterで使われるtreeviewとは?実用例やコードを交えて徹底解説!?

Tkinterで使われるtreeviewとは?実用例やコードを交えて徹底解説!?

今回はTkinterで使われるtreeviewに関して、実用例やコードを交えて徹底解説いたします。treeviewを使ってみたい、treeviewの実用例を通して学びを深めたい方へおすすめです。ぜひ最後までご一読ください。

目次
  1. そもそもTkinterで使われるtreeviewとは?
    1. Tkinterの構成要素
  2. 下準備
  3. Tkinterで活用されるtreeview Widgetの定義
    1. columns
    2. displaycolumns
    3. selectmode
    4. padding
    5. cursor
    6. xscrollcommand, yscrollcommand
    7. style
  4. テーマ(名前)を利用して、treeview Widgetの外観を変更
  5. treeviewで活用される5種類の関数
    1. column
    2. delete
    3. get_children
    4. heading
    5. insert
  6. 各アイテムが選択されるタイミングで、関数を実行する
  7. まとめ
  8. 参考文献
目次を開く⬇︎

そもそもTkinterで使われるtreeviewとは?

Tkinterで使われるtreeviewとは、Widgetの一種で、データを階層化して、表を作成するために利用するものを意味します。

別名treeview Widgetと呼ばれます。

少し言葉だけでは分かりづらいですね。。以下の「Tkinterの構成要素」を確認しながら、情報を整理しましょう。

Tkinterの構成要素

Tkinterの構成要素として、Window, Frame, Widgetの概念が存在します。

名称説明文
Window  画像の黄色枠の部分になります。Tkinter画面全体を表します。
Frame画像内のピンク色枠部分になります。Widgetが1つ以上ある場合に、取りまとめるものです。
Widget黄緑色枠で囲まれる部分になります。1つの機能を持つ最小単位 = Widgetと考えると良いでしょう。

前の章でTkinterで使われるtreeviewとは、Widgetの一種で、データを階層化して、表を作成するために利用するものとお伝えしました。

「Tkinterの構成要素」の画像内では、黄緑色枠に該当するWidgetに対して、編集することになります。

Tkinterの構成要素を理解したところで、実際にtreeviewの活用方法を理解していきましょう。

下準備

今回は先ほど紹介した「Tkinterの構成要素」の画像を元に、treeviewの使い方をお伝えします。

下にコードを貼り付けておきますので、画像と見比べながら、コードを確認してみてください。できれば、一緒にtreeviewを体験しましょう。

1import tkinter as tk
2from tkinter import ttk
3
4class Application(tk.Frame):
5    # treeview Widgetの情報を格納する変数
6    treeview = None
7
8    def __init__(self, master=None):
9        # Windowの初期設定を行う。
10        super().__init__(master)
11
12        # Windowの画面サイズを設定する。
13        # geometryについて : https://kuroro.blog/python/rozH3S2CYE0a0nB3s2QL/
14        self.master.geometry("300x200")
15
16        # Windowを親要素として、frame Widget(Frame)を作成する。
17        # Frameについて : https://kuroro.blog/python/P20XOidA5nh583fYRvxf/
18        frame = tk.Frame(self.master)
19
20        # Windowを親要素とした場合に、frame Widget(Frame)をどのように配置するのか?
21        # packについて : https://kuroro.blog/python/UuvLfIBIEaw98BzBZ3FJ/
22        frame.pack()
23
24        # frame Widget(Frame)を親要素として、treeview Widgetを作成する。
25        # columns : 各データ列へ名前を設定。
26        self.treeview = ttk.Treeview(frame, columns=["colA", "colB", "colC"])
27
28        #############################################
29        # <各列に対してオプション設定>
30        # #0 : 階層列(ツリーカラム)を意味する。
31        # 階層列(ツリーカラム)のオプションを設定。
32        # width : 幅の設定
33        self.treeview.column("#0", width=100)
34        # colA列のオプションを設定。
35        # width : 幅の設定
36        self.treeview.column("colA", width=80)
37        # colB列のオプションを設定。
38        # width : 幅の設定
39        self.treeview.column("colB", width=80)
40        # colC列のオプションを設定。
41        # width : 幅の設定
42        self.treeview.column("colC", width=80)
43        #############################################
44
45        #############################################
46        # <各列の見出しに対してオプションを設定>
47        # #0 : 階層列(ツリーカラム)を意味する。
48        # 階層列(ツリーカラム)の見出し設定。階層列とする。
49        self.treeview.heading("#0", text="階層列")
50        # colA列の見出しを設定。データ列Aとする。
51        self.treeview.heading("colA", text="データ列A")
52        # colB列の見出しを設定。データ列Bとする。
53        self.treeview.heading("colB", text="データ列B")
54        # colC列の見出しを設定。データ列Cとする。
55        self.treeview.heading("colC", text="データ列C")
56        #############################################
57
58        #############################################
59        # <アイテムを挿入>
60        # 第一引数 : 階層化する場合、親要素のアイテムIDを指定。階層化しない場合、""を指定する。
61        # 第二引数 : どのindex(アイテム位置)へアイテムを挿入するのか指定する。tk.END : index(アイテムの最終位置)
62        # text option : 階層列へ表示するアイテムの名前を設定。
63        # open option : 子要素のアイテムを展開して表示するのかどうか設定する。True : 子要素のアイテムを展開して表示する, False : 子要素のアイテムを展開して表示しない、デフォルト。
64        # values option : データ列へ表示する値を設定。
65        # 戻り値 : アイテムID
66        itemAId = self.treeview.insert("", tk.END, text="itemA", open=True, values=("data1a", "data1b", "data1c"))
67        # 第一引数 : 階層化する場合、親要素のアイテムIDを指定。階層化しない場合、""を指定する。
68        # 第二引数 : どのindex(アイテム位置)へアイテムを挿入するのか指定する。tk.END : index(アイテムの最終位置)
69        # text option : 階層列へ表示するアイテムの名前を設定。
70        # open option : 子要素のアイテムを展開して表示するのかどうか設定する。True : 子要素のアイテムを展開して表示する, False : 子要素のアイテムを展開して表示しない、デフォルト。
71        # values option : データ列へ表示する値を設定。
72        # 戻り値 : アイテムID
73        itemBId = self.treeview.insert(itemAId, tk.END, text="itemB", open=True, values=("data2a", "data2b", "data2c"))
74        # 第一引数 : 階層化する場合、親要素のアイテムIDを指定。階層化しない場合、""を指定する。
75        # 第二引数 : どのindex(アイテム位置)へアイテムを挿入するのか指定する。tk.END : index(アイテムの最終位置)
76        # text option : 階層列へ表示するアイテムの名前を設定。
77        # values option : データ列へ表示する値を設定。
78        # 戻り値 : アイテムID
79        itemCId = self.treeview.insert(itemBId, tk.END, text="itemC", values=("data3a", "data3b", "data3c"))
80        # 第一引数 : 階層化する場合、親要素のアイテムIDを指定。階層化しない場合、""を指定する。
81        # 第二引数 : どのindex(アイテム位置)へアイテムを挿入するのか指定する。tk.END : index(アイテムの最終位置)
82        # text option : 階層列へ表示するアイテムの名前を設定。
83        # values option : データ列へ表示する値を設定。
84        # 戻り値 : アイテムID
85        itemDId = self.treeview.insert("", tk.END, text="itemD", values=("data4a", "data4b", "data4c"))
86        #############################################
87
88        # frame Widget(Frame)を親要素とした場合に、treeview Widgetをどのように配置するのか?
89        # packについて : https://kuroro.blog/python/UuvLfIBIEaw98BzBZ3FJ/
90        self.treeview.pack()
91
92# Tkinter初学者参考 : https://docs.python.org/ja/3/library/tkinter.html#a-simple-hello-world-program
93if __name__ == "__main__":
94    # Windowを生成する。
95    # Windowについて : https://kuroro.blog/python/116yLvTkzH2AUJj8FHLx/
96    root = tk.Tk()
97    app = Application(master=root)
98    # Windowをループさせて、継続的にWindow表示させる。
99    # mainloopについて : https://kuroro.blog/python/DmJdUb50oAhmBteRa4fi/
100    app.mainloop()

上記のコードをPython環境で実行すると、「Tkinterの構成要素」で紹介した画像の結果が表示されます。

Tkinterで活用されるtreeview Widgetの定義

treeview Widgetは、

1from tkinter import ttk
2
3ttk.Treeview(option1, option2, ...) or ttk.Treeview('親要素', option1, option2, ...)

で定義されます。

treeview Widgetで使われるoptionの種類としては

  • columns
  • displaycolumns
  • selectmode
  • padding
  • cursor
  • xscrollcommand, yscrollcommand
  • style

があります。順番に見ていきましょう。

※ optionの種類一覧を調べたい場合は、以下のようにコードを記述してご確認ください。

1from tkinter import ttk
2
3# treeviewを生成する。
4treeview = ttk.Treeview()
5# treeviewに関するoptionの種類一覧を取得する。
6print(treeview.keys())

columns

columns optionを利用すると、treeview Widgetの各データ列へ名前を設定します。

各データ列へ名前を設定しておくことで、データ列のオプション設定、見出しの追加、アイテムの追加を管理できます。

例えば、Python環境で下準備コードを実行すると、以下の画像のようにtreeview Widgetの各データ列へ名前を設定します。

displaycolumns

displaycolumns optionを利用すると、treeview Widgetの各データ列の表示順序を変更できます。

例えば下準備コードのself.treeview = ttk.Treeview(frame, columns=["colA", "colB", "colC"])箇所を、以下のように変更すると、

1# 別解法 ##########################
2# self.treeview = ttk.Treeview(frame, columns=["colA", "colB", "colC"])
3# self.treeview.config(displaycolumns=["colC", "colA", "colB"]) or self.treeview.configure(displaycolumns=["colC", "colA", "colB"])
4##################################
5self.treeview = ttk.Treeview(frame, columns=["colA", "colB", "colC"], displaycolumns=["colC", "colA", "colB"])

以下の画像のようにtreeview Widgetを描画します。

selectmode

selectmode optionを利用すると、treeview Widgetの選択方式を変更できます。

指定方法としては、

  • extended(複数選択可能にする)
  • browse(単数選択可能にする、デフォルト)
  • none(選択不能にする)

の3種類があります。

例えば下準備コードのself.treeview = ttk.Treeview(frame, columns=["colA", "colB", "colC"])箇所を、以下のように変更すると、

1# 別解法 ##########################
2# self.treeview = ttk.Treeview(frame, columns=["colA", "colB", "colC"])
3# self.treeview.config(selectmode='browse') or self.treeview.configure(selectmode='browse')
4##################################
5self.treeview = ttk.Treeview(frame, columns=["colA", "colB", "colC"], selectmode='browse')

以下の画像のように、treeview Widgetを単数選択可能にします。

筆者のMac OSでは、selectmode='extended'を設定しても、複数選択可能にならず、単数選択のみ可能になりました。

padding

padding optionを利用すると、treeview Widgetの表の外側へ、空白の幅を設定できます。

例えば下準備コードのself.treeview = ttk.Treeview(frame, columns=["colA", "colB", "colC"])箇所を、以下のように変更すると、

1# 別解法 ##########################
2# self.treeview = ttk.Treeview(frame, columns=["colA", "colB", "colC"])
3# self.treeview.config(padding=(30, 40, 20, 10)) or self.treeview.configure(padding=(30, 40, 20, 10))
4##################################
5# padding : (左端, 上端, 右端, 下端)の順で、空白の幅を持たせる。
6self.treeview = ttk.Treeview(frame, columns=["colA", "colB", "colC"], padding=(30, 40, 20, 10))

以下の画像のように、treeview Widgetを描画します。

cursor

cursor optionを利用すると、treeview Widget内へマウスカーソルを移動すると矢印の見た目を変化できます。

見た目のバリエーションについてはこちらのサイトにまとまっていますので、ご確認ください。

例えば下準備コードのself.treeview = ttk.Treeview(frame, columns=["colA", "colB", "colC"])箇所を、以下のように変更して、

1# 別解法 ##########################
2# self.treeview = ttk.Treeview(frame, columns=["colA", "colB", "colC"])
3# self.treeview.config(cursor="clock") or self.treeview.configure(cursor="clock")
4##################################
5self.treeview = ttk.Treeview(frame, columns=["colA", "colB", "colC"], cursor="clock")

treeview Widget内へマウスカーソルを移動すると、矢印の見た目が変更します。

xscrollcommand, yscrollcommand

xscrollcommand option, yscrollcommand optionに関しては、Tkinterで使われるscrollbarとは?活用事例を交えて徹底解説の「その他のWidgetを使った、scrollbar Widgetサンプル集」でまとめておりますので、是非ご確認ください。

style

style optionを利用すると、treeview Widgetのoptionをまとめて設定したり、treeview Widgetのoptionに存在しない、その他のoptionを利用できます。

以下の3ステップで設定できます。

  1. スタイルオブジェクト(ttk.Style())の生成
  2. configure()関数を使用して、optionの設定
  3. treeview Widget内のstyle optionへ2で作成したものを設定

例えば下準備コードを以下のように変更すると、

1def __init__(self, master=None):
2    ...
3    frame.pack()
4+   # 1. スタイルオブジェクト(ttk.Style())の生成
5+   style = ttk.Style()
6+   # 2. configure()関数を使用して、optionの設定
7+   # 第一引数 : {お好みの名前}.TTreeviewで設定ください。
8+   # 第二引数以降 : optionを設定ください。
9+   # foreground : アイテムの文字列色を設定。
10+   # 色について : https://kuroro.blog/python/YcZ6Yh4PswqUzaQXwnG2/
11+   # font : アイテムの文字の形式や大きさを設定。
12+   # fontについて : https://kuroro.blog/python/RZNjLl36upkumxwkTRWl/
13+   # rowheight : アイテムの高さを設定。
14+   # background : アイテムの背景色を設定。
15+   # indent : 階層間の幅を設定。
16+   # fieldbackground : アイテム以外の背景色を設定。
17+   style.configure("test.TTreeview", foreground='red', font=('', 20), rowheight=30, background='green', indent=5, fieldbackground='purple')
18-   self.treeview = ttk.Treeview(frame, columns=["colA", "colB", "colC"])
19+   # 3. treeview Widget内のstyle optionへ2で作成したものを設定
20+   self.treeview = ttk.Treeview(frame, columns=["colA", "colB", "colC"], style='test.TTreeview')

以下の画像のようにtreeview Widgetを描画します。

筆者のMac OSで調べたところ、style optionを活用すると、追加して以下のoptionが利用できます。

  • foreground
  • font
  • rowheight
  • background
  • indent
  • fieldbackground

次項で述べる、テーマ(名前)によってstyleで指定するoptionが適用されない場合もございます。これはテーマ(名前)で設定されているstyleが優先されるためです。優先度 : テーマ(名前)のstyle > style option

テーマ(名前)を利用して、treeview Widgetの外観を変更

ttk.Treeview()では、テーマ(名前)を指定することで、treeview Widgetの外観を変更できます。

例えば以下のようなコードを作成すると、

1import tkinter as tk
2from tkinter import ttk
3
4class Application(tk.Frame):
5    # treeview Widgetの情報を格納する変数
6    treeview = None
7
8    def __init__(self, master=None):
9        # Windowの初期設定を行う。
10        super().__init__(master)
11
12        # Windowの画面サイズを設定する。
13        # geometryについて : https://kuroro.blog/python/rozH3S2CYE0a0nB3s2QL/
14        self.master.geometry("300x200")
15
16        # Windowを親要素として、frame Widget(Frame)を作成する。
17        # Frameについて : https://kuroro.blog/python/P20XOidA5nh583fYRvxf/
18        frame = tk.Frame(self.master)
19
20        # Windowを親要素とした場合に、frame Widget(Frame)をどのように配置するのか?
21        # packについて : https://kuroro.blog/python/UuvLfIBIEaw98BzBZ3FJ/
22        frame.pack()
23
24        # ttk.Treeview()の外観を変更
25        style = ttk.Style()
26        # テーマ(名前)の指定を行う。
27        style.theme_use('classic')
28
29        # frame Widget(Frame)を親要素として、treeview Widgetを作成する。
30        # columns : 各データ列へ名前を設定。
31        self.treeview = ttk.Treeview(frame, columns=["colA", "colB", "colC"])
32
33        #############################################
34        # <各列に対してオプション設定>
35        # #0 : 階層列(ツリーカラム)を意味する。
36        # 階層列(ツリーカラム)のオプションを設定。
37        # width : 幅の設定
38        self.treeview.column("#0", width=100)
39        # colA列のオプションを設定。
40        # width : 幅の設定
41        self.treeview.column("colA", width=80)
42        # colB列のオプションを設定。
43        # width : 幅の設定
44        self.treeview.column("colB", width=80)
45        # colC列のオプションを設定。
46        # width : 幅の設定
47        self.treeview.column("colC", width=80)
48        #############################################
49
50        #############################################
51        # <各列の見出しに対してオプション設定>
52        # #0 : 階層列(ツリーカラム)を意味する。
53        # 階層列(ツリーカラム)の見出しを設定。階層列とする。
54        self.treeview.heading("#0", text="階層列")
55        # colA列の見出しを設定。データ列Aとする。
56        self.treeview.heading("colA", text="データ列A")
57        # colB列の見出しを設定。データ列Bとする。
58        self.treeview.heading("colB", text="データ列B")
59        # colC列の見出しを設定。データ列Cとする。
60        self.treeview.heading("colC", text="データ列C")
61        #############################################
62
63        #############################################
64        # <アイテムを挿入>
65        # 第一引数 : 階層化する場合、親要素のアイテムIDを指定。階層化しない場合、""を指定する。
66        # 第二引数 : どのindex(アイテム位置)へアイテムを挿入するのか指定する。tk.END : index(アイテムの最終位置)
67        # text option : 階層列へ表示するアイテムの名前を設定。
68        # open option : 子要素のアイテムを展開して表示するのかどうか設定する。True : 子要素のアイテムを展開して表示する, False : 子要素のアイテムを展開して表示しない、デフォルト。
69        # values option : データ列へ表示する値を設定。
70        # 戻り値 : アイテムID
71        itemAId = self.treeview.insert("", tk.END, text="itemA", open=True, values=("data1a", "data1b", "data1c"))
72        # 第一引数 : 階層化する場合、親要素のアイテムIDを指定。階層化しない場合、""を指定する。
73        # 第二引数 : どのindex(アイテム位置)へアイテムを挿入するのか指定する。tk.END : index(アイテムの最終位置)
74        # text option : 階層列へ表示するアイテムの名前を設定。
75        # open option : 子要素のアイテムを展開して表示するのかどうか設定する。True : 子要素のアイテムを展開して表示する, False : 子要素のアイテムを展開して表示しない、デフォルト。
76        # values option : データ列へ表示する値を設定。
77        # 戻り値 : アイテムID
78        itemBId = self.treeview.insert(itemAId, tk.END, text="itemB", open=True, values=("data2a", "data2b", "data2c"))
79        # 第一引数 : 階層化する場合、親要素のアイテムIDを指定。階層化しない場合、""を指定する。
80        # 第二引数 : どのindex(アイテム位置)へアイテムを挿入するのか指定する。tk.END : index(アイテムの最終位置)
81        # text option : 階層列へ表示するアイテムの名前を設定。
82        # values option : データ列へ表示する値を設定。
83        # 戻り値 : アイテムID
84        itemCId = self.treeview.insert(itemBId, tk.END, text="itemC", values=("data3a", "data3b", "data3c"))
85        # 第一引数 : 階層化する場合、親要素のアイテムIDを指定。階層化しない場合、""を指定する。
86        # 第二引数 : どのindex(アイテム位置)へアイテムを挿入するのか指定する。tk.END : index(アイテムの最終位置)
87        # text option : 階層列へ表示するアイテムの名前を設定。
88        # values option : データ列へ表示する値を設定。
89        # 戻り値 : アイテムID
90        itemDId = self.treeview.insert("", tk.END, text="itemD", values=("data4a", "data4b", "data4c"))
91        #############################################
92
93        # frame Widget(Frame)を親要素とした場合に、treeview Widgetをどのように配置するのか?
94        # packについて : https://kuroro.blog/python/UuvLfIBIEaw98BzBZ3FJ/
95        self.treeview.pack()
96
97# Tkinter初学者参考 : https://docs.python.org/ja/3/library/tkinter.html#a-simple-hello-world-program
98if __name__ == "__main__":
99    # Windowを生成する。
100    # Windowについて : https://kuroro.blog/python/116yLvTkzH2AUJj8FHLx/
101    root = tk.Tk()
102    app = Application(master=root)
103    # Windowをループさせて、継続的にWindow表示させる。
104    # mainloopについて : https://kuroro.blog/python/DmJdUb50oAhmBteRa4fi/
105    app.mainloop()

以下の画像のように、treeview Widgetを描画します。

また現在利用中のテーマ(名前)を確認する場合は、

1from tkinter import ttk
2
3style = ttk.Style()
4# 現在利用中のテーマ(名前)を確認
5currentTheme = style.theme_use() 
6print(currentTheme)

利用できるテーマ(名前)の一覧を確認する場合は、

1from tkinter import ttk
2
3style = ttk.Style() 
4# テーマ(名前)の一覧を確認
5allTheme = style.theme_names() 
6print(allTheme)

テーマ(名前)の指定を行う場合は、

1from tkinter import ttk
2
3style = ttk.Style()
4# テーマ(名前)の指定を行う。
5style.theme_use('テーマ(名前)') 

をご利用ください。

treeviewで活用される5種類の関数

treeviewで活用される関数として、

  • column
  • delete
  • get_children
  • heading
  • insert

の5種類が存在します。順に見ていきましょう。

column

column関数を利用すると、列に関するオプション情報の取得 or 設定できます。

1# 列に関するオプション情報を取得する場合
2# 第一引数 : 列名
3# 戻り値 : 列に関するオプション情報
4.column("列名")
5
6# 列に関するオプション情報を設定する場合
7# 第一引数 : 列名
8# 第二引数以降 : option1, option2, ...
9# 戻り値 : なし
10.column("列名", option1, option2, ...)

で定義されます。

例えば下準備コードのself.treeview.column("colA", width=80)箇所の下で、以下のようなコードを追加すると、

1def __init__(self, master=None):
2    ...
3    self.treeview.column("colA", width=80)
4+   print(self.treeview.column("colA"))

以下の画像のように、treeview Widgetを描画します。

また下準備コードのself.treeview.column("colA", width=80)箇所を、以下のように変更すると、

1self.treeview.column("colA", width=120)

以下の画像のように、treeview Widgetを描画します。

columnで使われるoptionの種類としては、以下のようになります。

option名説明文用例
width                  列の幅を設定できます。デフォルトの値 = 200self.treeview.column("colA", width=150)                         
minwidth                       列の最小幅を設定できます。デフォルトの値 = 20self.treeview.column("colA", minwidth=120)
stretch                       Windowの大きさを変更する場合に、列の幅も合わせて変更すべきかどうか設定できます。True(列の幅も変更する、デフォルト), False(列の幅は変更しない)になります。self.treeview.column("colA", stretch=False)
anchor列に対応するアイテムの値をどのように表示するのか設定できます。tk.W(左の真ん中へ配置。デフォルト), tk.N(上の真ん中へ配置。), tk.S(下の真ん中へ配置。), tk.E(右の真ん中へ配置。), tk.NE(右上へ配置。), tk.NW(左上へ配置。), tk.SW(左下へ配置。), tk.SE(右下へ配置。), tk.CENTER(中心へ配置。)のどれかを設定できます。self.treeview.column("colA", anchor=tk.NW)

delete

delete関数を利用すると、アイテムの単数削除 or アイテムの複数削除できます。

1# アイテムの単数削除の場合
2# 第一引数 : アイテムID
3.delete(アイテムID)
4
5# アイテムの複数削除の場合
6# 第一引数以降 : アイテムID1, アイテムID2, ...
7.delete(アイテムID1, アイテムID2, ...)

で定義されます。戻り値はありません。

例えば下準備コードのitemDId = self.treeview.insert("", tk.END, text="itemD", values=("data4a", "data4b", "data4c"))箇所の下で、以下のようなコードを追加すると、

1def __init__(self, master=None):
2     ...
3     itemDId = self.treeview.insert("", tk.END, text="itemD", values=("data4a", "data4b", "data4c"))
4+    self.treeview.delete(itemDId, itemCId)

以下の画像のように、treeview Widgetを描画します。

get_children

get_children関数を利用すると、アイテムIDに紐づく子要素のアイテムID一覧を取得できます。

1# アイテムIDに紐づく子要素のアイテムID一覧を取得
2# 第一引数 : アイテムID
3# 戻り値 : アイテムIDに紐づく子要素のアイテムID一覧
4.get_children(アイテムID)

で定義されます。

例えば下準備コードのitemDId = self.treeview.insert("", tk.END, text="itemD", values=("data4a", "data4b", "data4c"))箇所の下で、以下のようなコードを追加すると、

1def __init__(self, master=None):
2     ...
3     itemDId = self.treeview.insert("", tk.END, text="itemD", values=("data4a", "data4b", "data4c"))
4+    print(self.treeview.get_children(itemBId))

以下の画像のように、treeview Widgetを描画します。

heading

heading関数を利用すると、列に関する見出しのオプション情報を取得 or 設定できます。

1# 列に関する見出しのオプション情報を取得する場合
2# 第一引数 : 列名
3# 戻り値 : 列に関する見出しのオプション情報
4.heading("列名")
5
6# 列に関する見出しのオプション情報を設定する場合
7# 第一引数 : 列名
8# 第二引数以降 : option1, option2, ...
9.heading("列名", option1, option2, ...)

で定義されます。

例えば下準備コードのself.treeview.heading("colA", text="データ列A")箇所の下で、以下のようなコードを追加すると、

1def __init__(self, master=None):
2    ...
3    self.treeview.heading("colA", text="データ列A")
4+   print(self.treeview.heading("colA"))

以下の画像のように、treeview Widgetを描画します。

また下準備コードのself.treeview.heading("colA", text="データ列A")箇所を、以下のように変更すると、

1self.treeview.heading("colA", text="aaaaaa")

以下の画像のように、treeview Widgetを描画します。

headingで使われるoptionの種類としては、以下のようになります。

option名説明文用例
anchor               見出しをどのように表示するのか設定できます。tk.W(左の真ん中へ配置。デフォルト), tk.N(上の真ん中へ配置。), tk.S(下の真ん中へ配置。), tk.E(右の真ん中へ配置。), tk.NE(右上へ配置。), tk.NW(左上へ配置。), tk.SW(左下へ配置。), tk.SE(右下へ配置。), tk.CENTER(中心へ配置。)のどれかを設定できます。self.treeview.heading("colA", anchor=tk.NW)
text       見出しを変更できます。self.treeview.heading("colA", text='hogehoge')
command     見出しを選択した場合に実行する関数を設定できます。self.treeview.heading("colA", command=lambda: print('aaaa'))
image    見出しへ画像を貼り付ける設定を行います。self.treeview.heading("colA", image=image)

insert

insert関数を利用すると、アイテムを挿入できます。

1# アイテムを挿入する。
2# 第一引数 : 階層化する場合、親要素のアイテムIDを指定。階層化しない場合、""を指定する。
3# 第二引数 : どのindex(アイテム位置)へアイテムを挿入するのか指定する。
4# 第三引数以降(任意) : option1, option2, ...
5# 戻り値 : アイテムID
6.insert("アイテムID or "" ", index(アイテム位置), option1, option2, ...)

で定義されます。戻り値としてアイテムIDが返されます。

例えば下準備コードのitemDId = self.treeview.insert("", tk.END, text="itemD", values=("data4a", "data4b", "data4c"))箇所の下で、以下のようなコードを追加すると、

1def __init__(self, master=None):
2    ...
3    itemDId = self.treeview.insert("", tk.END, text="itemD", values=("data4a", "data4b", "data4c"))
4+   itemEId = self.treeview.insert("", tk.END, text="itemE", values=("data5a", "data5b", "data5c"))

以下の画像のように、treeview Widgetを描画します。

insertで使われるoptionの種類としては、以下のようになります。

option名説明文用例
open                      子要素のアイテムを展開して表示するのかどうか設定する。True(子要素のアイテムを展開して表示する), False(子要素のアイテムを展開して表示しない、デフォルト。)itemAId = self.treeview.insert("", tk.END, text="itemA", open=True, values=("data1a", "data1b", "data1c"))
text                       階層列へ表示するアイテムの名前を設定できます。itemAId = self.treeview.insert("", tk.END, text="itemA", open=True, values=("data1a", "data1b", "data1c"))
values                       データ列へ表示する値を設定できます。itemAId = self.treeview.insert("", tk.END, text="itemA", open=True, values=("data1a", "data1b", "data1c"))

各アイテムが選択されるタイミングで、関数を実行する

各アイテムが選択されるタイミングに、関数を実行したい場合もあるかと思います。

タイミングを合わせて関数を実行するためには、bind関数の利用が必要です。

例えば下準備コードを以下のように変更し、

1def __init__(self, master=None):
2    ...
3    self.treeview.pack()
4+   # bind関数について : https://kuroro.blog/python/eI5ApJE1wkU7bHsuwk0H/
5+   self.treeview.bind('<<TreeviewSelect>>', lambda event: print('aaa'))

Python環境で実行して、treeview Widgetのアイテム1つを選択します。

すると、選択と同時にlambda event: print('aaa')が実行されて、以下の画像のようにaaaを取得できます。

bind関数に関しては、【コード付】Tkinterで使われるbindとは?bindの仕組みを交えて解説でまとめていますので、詳しく知りたい方は是非ご確認ください。

まとめ

  • Tkinterで使われるtreeviewとは、Widgetの一種で、データを階層化して、表を作成するために利用するものを意味します。
  • 別名treeview Widgetと呼ばれます。

参考文献