KURORO BLOGのロゴ

このエントリーをはてなブックマークに追加
【サンプルコード付】Tkinterで使われるlistboxに関して徹底解説!?

【サンプルコード付】Tkinterで使われるlistboxに関して徹底解説!?

今回はTkinterで使われるlistboxに関して、サンプルコードを交えて徹底解説いたします。listboxに関して学びたい、実践的なコードを用いてlistboxを知りたい方へおすすめです。ぜひ最後までご一読ください。

目次
  1. そもそもTkinterで使われるlistboxとは?
    1. Tkinterの構成要素
  2. 下準備
  3. Tkinterで活用されるlistbox Widgetの定義
    1. background, bg
    2. fg, foreground
    3. width, height
    4. borderwidth, bd
    5. cursor
    6. font
    7. relief
    8. highlightcolor, highlightbackground, highlightthickness
    9. justify
    10. selectbackground
    11. selectborderwidth
    12. selectforeground
    13. exportselection
    14. state
    15. disabledforeground
    16. activestyle
    17. selectmode
    18. xscrollcommand, yscrollcommand
  4. listbox Widgetで活用される9種類の関数
    1. curselection
    2. delete
    3. get
    4. insert
    5. see
    6. selection_set, select_set
    7. select_clear, selection_clear
    8. selection_includes, select_includes
    9. size
  5. 選択肢が選択されるタイミングで、関数を実行する
  6. まとめ
  7. 参考文献
目次を開く⬇︎

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

Tkinterで使われるlistboxとは、Widgetの一種で、複数の選択肢の中から、1つ以上を選ぶときに使われる入力フォーム を意味します。

Web上でアンケートや会員登録する場面で使われ、別名listbox Widgetと呼ばれます。

知らない言葉がいくつか出てきましたね。。以下の「Tkinterの構成要素」を確認しながら、理解を深めましょう。

Tkinterの構成要素

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

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

前の章でTkinterで活用されるlistboxとは、Widgetの一種で、複数の選択肢の中から、1つ以上を選ぶときに使われる入力フォームとお伝えしました。

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

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

緑色枠の部分もWidgetなので編集対象だと考える方もいるかもしれません。緑色枠の部分はWidgetではあるけれども、buttonを表すWidgetですので、今回は編集対象から外れることになります。

下準備

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

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

1import tkinter as tk
2
3class Application(tk.Frame):
4    # listboxに関する情報を格納する変数
5    listBox = None
6
7    # 現在選択中のindex(位置番号)を取得する関数
8    def getSelect(self):
9        # curselection() : 現在選択中のindex(位置番号)を取得。
10        print(self.listBox.curselection())
11
12    # 引数へindex(位置番号)を指定して、選択肢が確認できる位置へ移動する関数
13    def setSee(self):
14        # see() : 引数へindex(位置番号)を指定して、選択肢が確認できる位置へ移動する。
15        # index(位置番号)は0から数える。
16        # see(11) : 上から12番目の選択肢が確認できる位置へ移動する。
17        self.listBox.see(11)
18
19    def __init__(self, master=None):
20        # Windowの初期設定を行う。
21        super().__init__(master)
22
23        # Windowの画面サイズを設定する。
24        # geometryについて : https://kuroro.blog/python/rozH3S2CYE0a0nB3s2QL/
25        self.master.geometry("300x200")
26
27        # Windowを親要素として、frame Widget(Frame)を作成する。
28        # Frameについて : https://kuroro.blog/python/P20XOidA5nh583fYRvxf/
29        frame = tk.Frame(self.master)
30
31        # Windowを親要素とした場合に、frame Widget(Frame)をどのように配置するのか?
32        # packについて : https://kuroro.blog/python/UuvLfIBIEaw98BzBZ3FJ/
33        frame.pack()
34
35        # frame Widget(Frame)を親要素として、listbox Widgetを作成する。
36        # height : 選択肢の表示数を設定
37        self.listBox = tk.Listbox(frame, height=5)
38        for month in ("1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"):
39            # listboxへ選択肢を格納する。
40            # insert : listbox内の指定箇所(index(位置番号))へ、選択肢を格納する。
41            # tk.END : 末尾を表す。
42            self.listBox.insert(tk.END, month)
43
44        # frame Widget(Frame)を親要素とした場合に、listbox Widgetをどのように配置するのか?
45        # packについて : https://kuroro.blog/python/UuvLfIBIEaw98BzBZ3FJ/
46        self.listBox.pack()
47
48        # frame Widget(Frame)を親要素として、button Widgetを作成する。
49        # text : テキスト情報
50        # width : ボタンの幅設定
51        # command : ボタンをクリックした場合に、実行する関数を設定する。self.getSelectとする。
52        # Buttonについて : https://kuroro.blog/python/oFju6EngDtcYtIiMIDf1/
53        checkSelectButton = tk.Button(frame, text="選択確認", width=15, command=self.getSelect)
54
55        # frame Widget(Frame)を親要素とした場合に、button Widgetをどのように配置するのか?
56        # packについて : https://kuroro.blog/python/UuvLfIBIEaw98BzBZ3FJ/
57        checkSelectButton.pack(side=tk.LEFT)
58
59        # frame Widget(Frame)を親要素として、button Widgetを作成する。
60        # text : テキスト情報
61        # width : ボタンの幅設定
62        # command : ボタンをクリックした場合に、実行する関数を設定する。self.setSeeとする。
63        # Buttonについて : https://kuroro.blog/python/oFju6EngDtcYtIiMIDf1/
64        moveButton = tk.Button(frame, text="移動", width=15, command=self.setSee)
65
66        # frame Widget(Frame)を親要素とした場合に、button Widgetをどのように配置するのか?
67        # packについて : https://kuroro.blog/python/UuvLfIBIEaw98BzBZ3FJ/
68        moveButton.pack(side=tk.LEFT)
69
70# Tkinter初学者参考 : https://docs.python.org/ja/3/library/tkinter.html#a-simple-hello-world-program
71if __name__ == "__main__":
72    # Windowを生成する。
73    # Windowについて : https://kuroro.blog/python/116yLvTkzH2AUJj8FHLx/
74    root = tk.Tk()
75    app = Application(master=root)
76    # Windowをループさせて、継続的にWindow表示させる。
77    # mainloopについて : https://kuroro.blog/python/DmJdUb50oAhmBteRa4fi/
78    app.mainloop()

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

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

listbox Widgetは、

1tk.Listbox(option1, option2, ...) or tk.Listbox('親要素', option1, option2, ...)

で定義されます。

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

  • background, bg
  • fg, foreground
  • width, height
  • borderwidth, bd
  • cursor
  • font
  • relief
  • highlightcolor, highlightbackground, highlightthickness
  • justify
  • selectbackground
  • selectborderwidth
  • selectforeground
  • exportselection
  • state
  • disabledforeground
  • activestyle
  • selectmode
  • xscrollcommand, yscrollcommand

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

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

1import tkinter as tk
2
3# listboxを生成する。
4listbox = tk.Listbox()
5# listboxに関するoptionの種類一覧を取得する。
6print(listbox.keys())

background, bg

background option, bg optionを利用すると、listbox Widgetの背景色を設定できます。

backgroundとbg両方のoptionを用いて、値を設定した場合、後ろの引数に設定されるoptionが優先されます。

色に関しては、Tkinterの色の使い方とは?活用例から色の一覧をまとめて紹介!?で総括していますので、詳しく知りたい方は是非ご確認ください。

例えば下準備コードのself.listBox = tk.Listbox(frame, height=5)箇所を、以下のように変更すると、

1# 別解法 ##########################
2# self.listBox = tk.Listbox(frame)
3# self.listBox.config(height=5, bg="red") or self.listBox.configure(height=5, bg="red")
4##################################
5# 色について : https://kuroro.blog/python/YcZ6Yh4PswqUzaQXwnG2/
6self.listBox = tk.Listbox(frame, height=5, bg="red")

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

fg, foreground

fg option, foreground optionを利用すると、選択肢の文字列色を変更できます。

fgとforeground両方のoptionを用いて、値を設定した場合、後ろの引数に設定されるoptionが優先されます。

例えば下準備コードのself.listBox = tk.Listbox(frame, height=5)箇所を、以下のように変更すると、

1# 別解法 ##########################
2# self.listBox = tk.Listbox(frame)
3# self.listBox.config(height=5, foreground="green") or self.listBox.configure(height=5, foreground="green")
4##################################
5# 色について : https://kuroro.blog/python/YcZ6Yh4PswqUzaQXwnG2/
6self.listBox = tk.Listbox(frame, height=5, foreground="green")

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

width, height

width option, height optionを利用すると、それぞれ1行あたりに表示可能な文字数・選択肢の表示数を設定できます。

デフォルトとしてwidth=20(1行あたり20文字を表示), height=10(選択肢を10項目表示)が設定されています。

例えば下準備コードのself.listBox = tk.Listbox(frame, height=5)箇所を、以下のように変更すると、

1# 別解法 ##########################
2# self.listBox = tk.Listbox(frame)
3# self.listBox.config(height=8, width=30) or self.listBox.configure(height=8, width=30)
4##################################
5self.listBox = tk.Listbox(frame, height=8, width=30)

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

borderwidth, bd

borderwidth option, bd optionを利用すると、listbox Widgetの枠の大きさを設定できます。

borderwidthとbd両方のoptionを用いて、値を設定した場合、後ろの引数に設定されるoptionが優先されます。

例えば下準備コードのself.listBox = tk.Listbox(frame, height=5)箇所を、以下のように変更すると、

1# 別解法 ##########################
2# self.listBox = tk.Listbox(frame)
3# self.listBox.config(height=5, bd=50) or self.listBox.configure(height=5, bd=50)
4##################################
5self.listBox = tk.Listbox(frame, height=5, bd=50)

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

cursor

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

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

例えば下準備コードのself.listBox = tk.Listbox(frame, height=5)箇所を、以下のように変更して、

1# 別解法 ##########################
2# self.listBox = tk.Listbox(frame)
3# self.listBox.config(height=5, cursor="clock") or self.listBox.configure(height=5, cursor="clock")
4##################################
5self.listBox = tk.Listbox(frame, height=5, cursor="clock")

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

font

font optionを利用すると、文字の形式や大きさを変更できます。

fontに関しては、Tkinterで使われるフォントって?2種類のフォントの設定方法を丁寧に解説でまとめておりますので、詳しく知りたい方は是非ご確認ください。

例えば下準備コードのself.listBox = tk.Listbox(frame, height=5)箇所を、以下のように変更すると、

1# 別解法 ##########################
2# self.listBox = tk.Listbox(frame)
3# self.listBox.config(height=5, font=("", 20, "underline")) or self.listBox.configure(height=5, font=("", 20, "underline"))
4##################################
5# fontについて : https://kuroro.blog/python/RZNjLl36upkumxwkTRWl/
6self.listBox = tk.Listbox(frame, height=5, font=("", 20, "underline"))

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

relief

relief optionを設定すると、listbox Widgetの枠のデザインを設定できます。

指定方法としては、

  • tk.RAISED
  • tk.SUNKEN
  • tk.FLAT
  • tk.RIDGE
  • tk.GROOVE
  • tk.SOLID

の6種類があります。

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

1+    reliefList = [tk.RAISED, tk.SUNKEN, tk.FLAT, tk.RIDGE, tk.GROOVE, tk.SOLID]
2+    for relief in reliefList:
3-        self.listBox = tk.Listbox(frame, height=5)
4+        self.listBox = tk.Listbox(frame, width=5, height=5, bd=20, relief=relief)
5         for month in ("1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"):
6              self.listBox.insert(tk.END, month)
7-        self.listBox.pack()
8+        self.listBox.pack(side=tk.LEFT)

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

highlightcolor, highlightbackground, highlightthickness

highlightcolor option, highlightbackground option, highlightthickness optionを利用すると、それぞれfocusがあてられた時の囲い線の色, focusが外れた時の囲い線の色(デフォルト), 囲い線の太さを設定します。

例えば下準備コードのself.listBox = tk.Listbox(frame, height=5)箇所を、以下のように変更すると、

1# 別解法 ##########################
2# self.listBox = tk.Listbox(frame)
3# self.listBox.config(height=5, highlightthickness=20, highlightbackground="red") or self.listBox.configure(height=5, highlightthickness=20, highlightbackground="red")
4##################################
5# 色について : https://kuroro.blog/python/YcZ6Yh4PswqUzaQXwnG2/
6self.listBox = tk.Listbox(frame, height=5, highlightthickness=20, highlightbackground="red")

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

また下準備コードのself.listBox = tk.Listbox(frame, height=5)箇所を、以下のように変更すると、

1# 色について : https://kuroro.blog/python/YcZ6Yh4PswqUzaQXwnG2/
2self.listBox = tk.Listbox(frame, height=5, highlightthickness=20, highlightcolor="blue")
3# listbox Widgetへfocusを与える。
4self.listBox.focus()

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

justify

justify optionを利用すると、listbox Widgetで利用する選択肢を、どちらに揃えるか設定できます。

指定方法としては、

  • tk.LEFT : 左寄せ(デフォルト)
  • tk.CENTER : 中央寄せ
  • tk.RIGHT : 右寄せ

の3種類があります。

例えば下準備コードのself.listBox = tk.Listbox(frame, height=5)箇所を、以下のように変更すると、

1# 別解法 ##########################
2# self.listBox = tk.Listbox(frame)
3# self.listBox.config(height=5, justify=tk.RIGHT) or self.listBox.configure(height=5, justify=tk.RIGHT)
4##################################
5self.listBox = tk.Listbox(frame, height=5, justify=tk.RIGHT)

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

selectbackground

selectbackground optionを利用すると、選択された選択肢の背景色を変更できます。

例えば下準備コードのself.listBox = tk.Listbox(frame, height=5)箇所を、以下のように変更すると、

1# 別解法 ##########################
2# self.listBox = tk.Listbox(frame)
3# self.listBox.config(height=5, selectbackground="red") or self.listBox.configure(height=5, selectbackground="red")
4##################################
5# 色について : https://kuroro.blog/python/YcZ6Yh4PswqUzaQXwnG2/
6self.listBox = tk.Listbox(frame, height=5, selectbackground="red")

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

selectborderwidth

selectborderwidth optionを利用すると、選択肢を選択できる幅を変更できます。

例えば下準備コードのself.listBox = tk.Listbox(frame, height=5)箇所を、以下のように変更すると、

1# 別解法 ##########################
2# self.listBox = tk.Listbox(frame)
3# self.listBox.config(height=5, selectborderwidth=10) or self.listBox.configure(height=5, selectborderwidth=10)
4##################################
5self.listBox = tk.Listbox(frame, height=5, selectborderwidth=10)

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

selectforeground

selectforeground optionを利用すると、選択された選択肢の文字列色を変更できます。

例えば下準備コードのself.listBox = tk.Listbox(frame, height=5)箇所を、以下のように変更すると、

1# 別解法 ##########################
2# self.listBox = tk.Listbox(frame)
3# self.listBox.config(height=5, selectforeground="red") or self.listBox.configure(height=5, selectforeground="red")
4##################################
5# 色について : https://kuroro.blog/python/YcZ6Yh4PswqUzaQXwnG2/
6self.listBox = tk.Listbox(frame, height=5, selectforeground="red")

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

exportselection

exportselection optionを利用すると、選択された文字列を、データとして記憶させるべきか設定できます。

値としてboolean(True, False)の指定が可能で、デフォルトではTrue(データとして記憶する)になります。

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

1    def getSelect(self):
2+       # 現在選択中の文字列を取得する。
3+       print(self.listBox.selection_get())
4        # curselection() : 現在選択中のindex(位置番号)を取得。
5        print(self.listBox.curselection())
6
7    def __init__(self, master=None):
8+       # exportselection=Falseへ変更する。
9-       self.listBox = tk.Listbox(frame, height=5)
10+       self.listBox = tk.Listbox(frame, height=5, exportselection=False)

「選択確認」ボタンをクリックすると、# _tkinter.TclError: PRIMARY selection doesn't exist or form "STRING" not definedのエラーがターミナルに表示されます。

state

state optionを利用すると、listbox Widgetの状態を設定できます。

指定方法としては、

  • normal : 選択を有効(デフォルト)
  • disabled : 選択を無効

があります。

例えば下準備コードのself.listBox = tk.Listbox(frame, height=5)箇所を、以下のように変更すると、

1# 別解法 ##########################
2# self.listBox = tk.Listbox(frame)
3# self.listBox.config(height=5, state="disabled") or self.listBox.configure(height=5, state="disabled")
4##################################
5self.listBox = tk.Listbox(frame, height=5, state="disabled")

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

disabledforeground

disabledforeground optionを利用すると、stateが"disabled"の場合の文字列色を変更できます。

※ 2021年6月21日現在、筆者のMac OSではdisabledforeground optionを指定しても、stateが"disabled"の場合の文字列色を変更できませんでした。

activestyle

activestyle optionを利用すると、選択されている選択肢のデザインを変更できます。

指定方法としては、

  • tk.DOTBOX : 選択項目を点線で囲む(デフォルト)
  • tk.NONE : 何も装飾しない
  • tk.UNDERLINE : 選択項目に下線を引く

の3種類があります。

例えば下準備コードのself.listBox = tk.Listbox(frame, height=5)箇所を、以下のように変更すると、

1# 別解法 ##########################
2# self.listBox = tk.Listbox(frame)
3# self.listBox.config(height=5, activestyle=tk.UNDERLINE) or self.listBox.configure(height=5, activestyle=tk.UNDERLINE)
4##################################
5self.listBox = tk.Listbox(frame, height=5, activestyle=tk.UNDERLINE)

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

selectmode

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

指定方法としては、

機能
selectmode=tk.SINGLE  1項目のみ選択可。クリックのみで選択項目を変更可能。
selectmode=tk.BROWSE1項目のみ選択可。クリック、方向キーで選択項目を変更可能(デフォルト)
selectmode=tk.MULTIPLE複数項目選択可。クリック、スペースキーで選択項目を変更可能。
selectmode=tk.EXTENDED複数項目選択可。クリック、方向キーで選択可能。shiftキーを押しながら、方向キーを選択すると、複数選択できる。

の4種類があります。

xscrollcommand, yscrollcommand

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

listbox Widgetで活用される9種類の関数

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

  • curselection
  • delete
  • get
  • insert
  • see
  • selection_set, select_set
  • select_clear, selection_clear
  • selection_includes, select_includes
  • size

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

curselection

curselection関数を利用すると、現在選択している選択肢の、index(位置番号)を取得できます。

要するに上から(0から)数えて何番目に、現在選択している選択肢があるのかを教えてくれます。

1.curselection()

で定義されます。

戻り値として、(現在選択している選択肢1のindex(位置番号), 現在選択している選択肢2のindex(位置番号), ...)で返されます。選択されるものがない場合は、()で返されます。

例えば、下準備の章で紹介したコードをPython環境で実行し、listbox Widgetの選択肢をクリックして「選択確認」ボタンを押すと、以下の画像のように表示されます。

delete

delete関数を利用すると、1つ以上の選択肢を削除できます。

1# 単数の選択肢を削除する場合
2# 第一引数 : 削除したい選択肢のindex(位置番号)
3.delete("index(位置番号)")
4
5# 複数の選択肢を削除する場合
6# 第一引数 : 削除したい選択肢の始まりindex(位置番号)
7# 第二引数 : 削除したい選択肢の終わりindex(位置番号)
8.delete("始まりindex(位置番号)", "終わりindex(位置番号)")

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

例えば下準備コードのself.listBox.pack()の下へ、以下のコードを追加すると、

1def __init__(self, master=None):
2     ...
3     self.listBox.pack()
4+    self.listBox.delete(0)

以下の画像のようにlistbox Widgetの選択肢から「1月」が削除されます。

また下準備コードのself.listBox.pack()の下へ、以下のコードを追加すると、

1def __init__(self, master=None):
2     ...
3     self.listBox.pack()
4+    self.listBox.delete(0, 4)

以下の画像のようにlistbox Widgetの選択肢から「1月~5月」が削除されます。

get

get関数を利用すると、1つ以上の選択肢の値を取得できます。

1# 単数の選択肢の値を取得する場合
2# 第一引数 : 取得したい選択肢のindex(位置番号)
3.get("index(位置番号)")
4
5# 複数の選択肢の値を取得する場合
6# 第一引数 : 取得したい選択肢の始まりindex(位置番号)
7# 第二引数 : 取得したい選択肢の終わりindex(位置番号)
8.get("始まりindex(位置番号)", "終わりindex(位置番号)")

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

例えば下準備コードのself.listBox.pack()の下へ、以下のコードを追加すると、

1def __init__(self, master=None):
2     ...
3     self.listBox.pack()
4+    print(self.listBox.get(0))

以下の画像のように「1月」が表示されます。

また下準備コードのself.listBox.pack()の下へ、以下のコードを追加すると、

1def __init__(self, master=None):
2     ...
3     self.listBox.pack()
4+    print(self.listBox.get(0, 4))

以下の画像のように「1月~5月」が取得されます。

insert

insert関数を利用すると、1つ以上の選択肢を追加できます。

1# 単数の選択肢を挿入する場合
2# 第一引数 : 挿入したい選択肢先のindex(位置番号)
3# 第二引数 : 選択肢
4.insert("index(位置番号)", "選択肢")
5
6# 複数の選択肢を挿入する場合
7# 第一引数 : 挿入したい選択肢先のindex(位置番号)
8# 第二引数以降 : 選択肢1, 選択肢2, ...
9.insert("index(位置番号)", "選択肢1", "選択肢2", ...)

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

例えば下準備コードのself.listBox.pack()の下へ、以下のコードを追加すると、

1def __init__(self, master=None):
2     ...
3     self.listBox.pack()
4+    self.listBox.insert(0, "test")

以下の画像のように「1月」の上へtestの選択肢が追加されます。

また下準備コードのself.listBox.pack()の下へ、以下のコードを追加すると、

1def __init__(self, master=None):
2     ...
3     self.listBox.pack()
4+    self.listBox.insert(0, "test1", "test2")

以下の画像のように「1月」の上にtest1, test2の選択肢が追加されます。

see

see関数を利用すると、選択肢が確認できる位置へ移動できます。

1# 選択肢が確認できる位置へ移動する関数
2# 第一引数 : 確認したい選択肢のindex(位置番号)
3.see("index(位置番号)")

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

例えば、下準備の章で紹介したコードをPython環境で実行し、「移動」ボタンを押すと、以下の画像のように「12月」の選択肢が確認できる位置へ移動します。

selection_set, select_set

selection_set, select_set関数を利用すると、1つ以上の選択肢を選択できます。

1# 単数の選択肢を選択する場合
2# 第一引数 : 選択したい選択肢のindex(位置番号)
3.select_set("index(位置番号)") or .selection_set("index(位置番号)")
4
5# 複数の選択肢を選択する場合
6# 第一引数 : 選択したい選択肢の始まりindex(位置番号)
7# 第二引数 : 選択したい選択肢の終わりindex(位置番号)
8.select_set("始まりindex(位置番号)", "終わりindex(位置番号)") or .selection_set("始まりindex(位置番号)", "終わりindex(位置番号)")

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

例えば下準備コードのself.listBox.pack()の下へ、以下のコードを追加すると、

1def __init__(self, master=None):
2    ...
3    self.listBox.pack()
4+   self.listBox.selection_set(1) 

以下の画像のように「2月」が選択されます。

また下準備コードのself.listBox.pack()の下へ、以下のコードを追加すると、

1def __init__(self, master=None):
2     ...
3     self.listBox.pack()
4+    self.listBox.selection_set(1, 2)

以下の画像のように「2月、3月」が選択されます。

select_clear, selection_clear

select_clear, selection_clear関数を利用すると、1つ以上の選択肢の選択をクリア(解除)できます。

1# 単数の選択肢をクリア(解除)する場合
2# 第一引数 : クリア(解除)したい選択肢のindex(位置番号)
3.select_clear("index(位置番号)") or .selection_clear("index(位置番号)")
4
5# 複数の選択肢をクリア(解除)する場合
6# 第一引数 : クリア(解除)したい選択肢の始まりindex(位置番号)
7# 第二引数 : クリア(解除)したい選択肢の終わりindex(位置番号)
8.select_clear("始まりindex(位置番号)", "終わりindex(位置番号)") or .select_clear("始まりindex(位置番号)", "終わりindex(位置番号)")

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

例えば下準備コードのself.listBox.pack()の下へ、以下のコードを追加すると、

1def __init__(self, master=None):
2     ...
3     self.listBox.pack()
4+    self.listBox.select_set(1, 2) 
5+    self.listBox.select_clear(1)

以下の画像のように「2月、3月」が選択されて、「2月」の選択が解除されます。

また下準備コードのself.listBox.pack()の下へ、以下のコードを追加すると、

1def __init__(self, master=None):
2      ...
3      self.listBox.pack()
4+     self.listBox.select_set(1, 3) 
5+     self.listBox.select_clear(1, 2)

以下の画像のように「2月、3月、4月」が選択されて、「2月、3月」の選択が解除されます。

selection_includes, select_includes

selection_includes, select_includes関数を利用すると、指定するindex(位置番号)が、現在選択されているのか判定できます。

1# 指定するindex(位置番号)が、現在選択されているのか確認する関数
2# 第一引数 : 選択されているのか確認したい、選択肢のindex(位置番号)
3.selection_includes("index(位置番号)") or .select_includes("index(位置番号)")

で定義されます。戻り値としては、True(現在選択されている) or False(現在選択されていない)を返します。

例えば下準備コードのself.listBox.pack()の下へ、以下のコードを追加すると、

1def __init__(self, master=None):
2    ...
3    self.listBox.pack()
4+   print(self.listBox.selection_includes(1))

以下の画像のように「2月」は現在選択されていないので、Falseが返されます。

size

size関数を利用すると、選択肢の数を取得できます。

1.size()

で定義されます。戻り値として数値(選択肢の数)が返されます。

例えば下準備コードのself.listBox.pack()の下へ、以下のコードを追加すると、

1def __init__(self, master=None):
2     ...
3     self.listBox.pack()
4+    print(self.listBox.size())

以下の画像のように「1月~12月」の選択肢の数、12が取得できます。

選択肢が選択されるタイミングで、関数を実行する

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

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

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

1-   def getSelect(self):
2+   def getSelect(self, event):
3
4    def __init__(self, master=None):
5        ...
6        self.listBox.pack()
7+       # bind関数について : https://kuroro.blog/python/eI5ApJE1wkU7bHsuwk0H/
8+       self.listBox.bind('<<ListboxSelect>>', self.getSelect)

Python環境で実行して、listbox Widgetの選択肢を選択します。

すると、選択と同時にself.getSelect関数が実行されて、以下の画像のように現在選択中のindex(位置番号)を取得できます。

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

まとめ

  • Tkinterは、Window, Frame, Widgetで構成される。
  • Tkinterで使われるlistboxとは、Widgetの一種で、複数の選択肢の中から、1つ以上を選ぶときに使われる入力フォームを意味します。
  • 別名listbox Widgetと呼ばれます。

参考文献