このページでは tkinter のウィジェットの1つである「リストボックス(Listbox
クラス)」の使い方について解説していきます。
私の下記環境での実行結果をもとに説明していますが、環境によっては動きが異なるかもしれません
実際にご自身の環境で実行結果を確認していただくと、より確実に設定の効果を理解することができると思います
- OS:macOS Big Sur
- Python:3.9.4
- Tkinter:8.6
Contents
- リストボックスウィジェット
- リストボックスの使い方
- リストボックスのメソッド
- メソッドに指定可能な特別なインデックス
- curselection:選択中の項目のインデックスを取得
- get:項目を取得
- insert:項目を追加
- delete:項目を削除
- select_set:項目を選択
- select_clear:項目の選択を解除
- select_includes:項目が選択中であるかの判断
- itemconfig:項目のオプション設定
- itemcget:項目のオプション取得
- size:項目数を取得
- see:項目の表示
- nearest:一番近い項目のインデックスを取得
- bbox:項目が表示されている位置の取得
- select_anchor:tkinter.ANCHOR の記憶
- activate:項目をアクティブ化
- index:インデックスの取得
- xview・yview:スクロールバーとの連動
- リストボックスのオプション
- まとめ
リストボックスウィジェット
まずは、リストボックスウィジェットがどのようなウィジェットであるのかについて解説していきます。
リストボックスウィジェットとは
リストボックスは下の図のようなウィジェットになります(OS 等の環境によっては見た目が異なる可能性があります)。
このリストボックスウィジェットは、選択可能な項目の一覧をユーザーに示し、その中の1つもしくは複数の項目をユーザーに選択してもらうことを目的として利用するウィジェットになります。
もちろん、ただ項目を選択してもらうだけでは意味がないので、アプリとしてはユーザーが選択した項目に基づいて処理を切り替えるような動作を実現する必要があります。
スポンサーリンク
リストボックスの使い方
では、このリストボックスの使い方について解説していきたいと思います。
まずは、このリストボックスを利用した簡単なアプリのスクリプト例を示したいと思います。
# -*- coding:utf-8 -*-
import tkinter
def change_fill():
# 現在選択されている項目のインデックスを取得
indices = listbox.curselection()
if len(indices) != 1:
# 2つ以上選択されているor1つも選択されていない
return
# 項目を取得
index = indices[0]
color = listbox.get(index)
# 取得した項目で長方形の色を変更
canvas.itemconfig(rect, fill=color)
app = tkinter.Tk()
# キャンバスの作成と配置
canvas = tkinter.Canvas(
app,
width=300,
height=200,
highlightthickness=0
)
canvas.grid(row=0, column=0, padx=10, pady=10)
# キャンバスに長方形描画
rect = canvas.create_rectangle(
10, 10, 290, 190,
fill="white",
width=1,
)
# リストボックスの作成と配置
listbox = tkinter.Listbox(
app
)
listbox.grid(row=0, column=1, padx=10, pady=10)
# リストボックスに項目追加
colors = [
"red", "blue", "green"
]
for color in colors:
listbox.insert(tkinter.END, color)
# ボタンの作成と配置
button = tkinter.Button(
app,
text="色変更",
command=change_fill
)
button.grid(row=1, column=1, padx=10, pady=10)
app.mainloop()
上記スクリプトで使用している各メソッドについては、それぞれ下記のページで解説していますので、詳しく知りたい方はこれらのページをご参照していただければと思います
create_rectangle
メソッド(長方形を描画)
Tkinterの使い方:Canvasクラスで図形を描画するitemconfig
メソッド(図形の設定変更)
Tkinterの使い方:Canvasクラスで描画した図形を操作するgrid
メソッド(ウィジェットの配置)
Tkinterの使い方:ウィジェットの配置(pack・grid・place)
上記スクリプトを実行すれば、次の図のようなアプリが起動します。
このアプリには、下の図のようにウィジェットが配置されています。
リストボックスに表示されている色の項目一覧から1つの色を選択した後に、”色変更” ボタンをクリックすれば、キャンバス上の長方形の色が選択した色に変化します。
このような動作は、ボタンが押された際にリストボックスで選択されている色名("red"
or "blue"
or "green"
)を取得し、その色でキャンバス上の長方形の塗りつぶし色を変更することで実現しています。
こんな感じでリストボックスを使用する際には、単にリストボックスを作成するだけでなく、どの項目が選択中であるかを取得し、それに応じて動作を切り替えるような処理を記述する必要があります。
ですので、リストボックスウィジェットを使用する際に最低限必要な処理は下記の2つになると思います。
- リストボックスの作成
- 選択中の項目の取得
ここからは、上記2つの処理の実現方法について解説していきたいと思います。
リストボックスの作成
リストボックスウィジェットは、tkinter の Listbox
クラスのコンストラクタを実行することで作成することができます。
# app はメインウィンドウ等の親ウィジェット
listbox = tkinter.Listbox(
app
)
上記では、Listbox
クラスのコンストラクタにリストボックスウィジェットの作成先となる親ウィジェット(上記の場合は app
)のみを指定していますが、この Listbox
クラスのコンストラクタには様々なオプションが用意されており、それを指定することで作成するリストボックスウィジェットの詳細を設定することが可能です。
このオプションにつきましては、後述の リストボックスのオプション で解説していきたいと思います。
話を戻すと、上記の Listbox
クラスのコンストラクタで作成したリストボックスウィジェットを配置すると、下の図のようなウィジェットがアプリ上に表示されるようになります。
一応これでリストボックスウィジェットは作成できています。ですが、項目が1つもないですね…。
こんな感じで、リストボックスウィジェットは単に作成しただけだと項目が1つもありません。ですので、最初から項目をリストボックスに表示したい場合、アプリが起動する前に(mainloop
を実行する前に)リストボックスに表示する項目を設定しておく処理が必要になります。
このリストボックスに表示する項目を設定する方法には下記の2つがあります。
- ウィジェット変数を利用する
- リストボックスのメソッドを利用する
続いては、これらの方法について解説していきます。
ウィジェット変数を利用する
リストボックスに表示する項目を設定する方法の1つ目は「ウィジェット変数を利用する」です。
まだウィジェット変数についてご存知ない方は、下記のページで詳しく解説していますので宜しければこちらをご覧いただければと思います。
Tkinterの使い方:ウィジェット変数について解説【StringVar・BooleanVar・IntVar・DoubleVar】リストボックスウィジェットを作成する tkinter.Listbox()
では、引数で listvariable
オプションを設定することが可能です。
このオプションにウィジェット変数を指定することで、リストボックス作成時にそのウィジェット変数が持つリストの各要素をリストボックスに表示するの項目として設定することができます。
具体的な手順としては、まずリストの作成を行います。
例えば下記では、"red"
と "blue"
と "green"
の3つの要素を持つリストを作成しています。この、リストの各要素が、以降の手順を踏むことでリストボックスに表示される項目に設定されます。
color_list = ["red", "blue", "green"]
次に、ウィジェット変数を作成します。
今回は、先程作成したリストの各要素が文字列であるため、tkinter.StringVar
型のウィジェット変数を作成します。この作成するウィジェット変数の型は、リストの各要素の型に合わせて選択すれば良いです。
で、このウィジェット変数を作成する際にポイントなるのが、先程作成したリストを value
オプションに指定するところです。
# app は親ウィジェット
color_v = tkinter.StringVar(app, value=color_list)
これにより、作成したリストを持つウィジェット変数が作成されたことになりますので、最後にリストボックスウィジェットを作成する際に、すなわち tkinter.Listbox()
を実行する際に、引数としてオプション listvariable
を指定します。
で、この listvariable
に設定するのが、先程作成したウィジェット変数になります。
listbox = tkinter.Listbox(
app, # 親ウィジェット
listvariable=color_v
)
以上で、ウィジェット変数を利用したリストボックスへの項目の設定は完了です。
上記で作成したリストボックウィジェットは下の図のようなものになり、最初に作成したリストの各要素を項目とするリストボックスに仕上がっていることが確認できると思います。
リストボックスのメソッドを利用する
リストボックスに表示する項目を設定する方法の2つ目は「リストボックスのメソッドを利用する」です。
この方法では、まず項目が空のリストボックスを作成し、そのリストボックスに項目を追加していくことで表示する項目の設定を行います。
この項目を追加する際には、tkinter.Listbox
クラスに用意されている insert
メソッドを利用します。
insert(self, index, *elements)
引数 index
には項目を追加する位置を指定し(リストボックスの一番上の項目を 0
とした時に上から何番目の位置に追加したいかを指定する)、さらに引数 elements
には追加する項目そのものを指定します。
以降では、この index
に指定するような、リストボックスの上から何番目の項目であるかを示す番号をインデックスと呼ばせていただきます。
index
には tkinter.END
という値も指定することも可能で、これを指定することでリストボックスの一番最後に項目を追加することもできます。
ですので、例えばリストボックスに項目 "red"
と "blue"
と "green"
を追加したい場合は、次のように処理を行えば良いです。
listbox = tkinter.Listbox(
app, # 親ウィジェット
)
listbox.insert(tkinter.END, "red")
listbox.insert(tkinter.END, "blue")
listbox.insert(tkinter.END, "green")
この insert
メソッドを利用すれば、後から何らかのタイミング(例えばボタンが押された時など)に項目を追加することもできますし、逆に項目を削除するようなメソッドも用意されています。
これらのメソッドについては、後述の リストボックスのメソッド で紹介していきます。
選択中の項目の取得
続いて、選択中の項目の取得方法について解説していきます。
この選択中の項目の取得は、下記の2つの手順により実現することができます。
- 選択中の項目のインデックスを取得する
- インデックスを指定して項目を取得する
選択中の項目のインデックスを取得する
選択中の項目を取得するためにまず行う必要があるのが、その選択中の項目のインデックスの取得です。
これは、curselection
メソッドにより取得することができます。
curselection(self)
curselection
メソッドは引数なしで実行することができ、戻り値は、curselection
を実行したリストボックスウィジェット(tkinter.Listbox
のオブジェクト)で “選択中の項目のインデックス” が格納されたタプルとなります。
ですので、このタプルの要素を取得することにより、選択中の項目のインデックスを取得することができます。
このタプルの要素数(つまり選択中の項目のインデックスの数)は必ず1つであるとは限らない点に注意してください。
選択中の項目が複数のときに curselection
を実行すると、戻り値で取得できるタプルの要素数は複数個になりますし、1つも項目が選択されていないときに curselection
を実行すると、戻り値で取得できるタプルは空になります。
後述で解説しますが、リストボックスではオプションの指定により項目を複数同時に選択できるようにすることができます
選択中の項目のインデックスが複数の場合も考慮して処理を行いたいような場合は、下記のようにループを形成して、インデックスを1つずつ取得しながら処理をするのが良いと思います。
indices = listbox.curselection()
# indicesから1つ1つ要素を取り出しながらループ
for index in indices:
# 何らかの処理を実行
選択中の項目のインデックスが1つの場合以外は処理をスキップしたいような場合は、下記のようにタプルの要素数を調べてから処理を実行すれば良いです。
indices = listbox.curselection()
# インデックスの数が1つの場合のみ処理を実行
if len(indices) == 1:
# 何らかの処理を実行
インデックスを指定して項目を取得する
curselection
メソッドにより選択中の項目のインデックスが取得できれば、次は目的の “選択中の項目” の取得を行います。
これは、tkinter.Listbox
の get
メソッドにより実現することができます。
get(self, first, last=None)
get
メソッドを実行すれば、メソッドを実行したリストボックスウィジェットの first
から last
のインデックスの項目を取得することができます。last
を指定した場合、その項目はタプルに格納された形で取得されることになります。
また、last
に関しては省略可能で、この際には first
で指定した位置の項目そのものが取得されます(タプルではない)。
したがって、first
に curselection
メソッドの戻り値のタプルから取得したインデックスを指定して get
メソッドを実行することで、選択中の項目を取得することができます。
例えば下記のように処理を実行すれば、選択中の項目が1つの時に限り、select_item
に選択中の項目を格納することができます。
indices = listbox.curselection()
# インデックスの数が1つの場合のみ項目を取得
if len(indices) == 1:
select_item = listbox.get(indices[0])
また、例えば下記のように処理を実行すれば、選択中の項目全てをリスト select_items
に格納することができます。
indices = listbox.curselection()
select_items = []
# indicesから1つ1つ要素を取り出しながら項目を取得
for index in indices:
select_item = listbox.get(index)
select_items.append(select_item)
下記でも選択中の項目全てを取得することができそうではありますが、選択中の項目のインデックスが連続していない場合は、選択中でない項目まで取得してしまうことになるので注意してください。
indices = listbox.curselection()
select_items = listbox.get(indices[0], indices[-1])
例えば curselection
で取得できるタプル indices
が (1, 2, 5)
の場合、インデックスが 1
〜 5
の 5
つの項目全てを取得することになってしまいます(本当に取得したい項目はインデックスが 1
と 2
と 5
の 3
つの項目のみのはず)。
ですので、複数の項目が飛び飛びで選択される可能性がある場合、前述したようにループを組んで1つ1つのインデックスに対して get
を実行する方が無難だと思います。
選択中の項目の取得方法の解説は以上となります。
あとは、この取得した項目に応じて何らかの処理を行うようにすれば、ユーザーからの選択に応じてアプリの動作を切り替えるようなことができるようになります。
例えば リストボックスの使い方 の最初に紹介したアプリでは、その取得した項目を長方形の塗りつぶし色に反映することで、ユーザーからの選択に応じて表示される長方形の色が変化するように動作させています。
スポンサーリンク
リストボックスのメソッド
基本的なリストボックスウィジェットの使い方は前述の通りになります。
ここからは、より詳細なリストボックウィジェットの解説を行なっていきます。
まずは、リストボックスウィジェット(tkinter.Listbox
クラス)に用意された、このウィジェット特有のメソッドについて解説していきます。
メソッドに指定可能な特別なインデックス
と、その前に、まずはメソッドに指定可能な特別なインデックスについて紹介しておきます。
リストボックスウィジェットのメソッドにおいては、ここまで紹介してきた get
や insert
メソッドのように引数でインデックスを指定するものが多いです。
このインデックス指定時には、下記の3つの特別なインデックスを指定することが可能です。
tkinter.END
:最後の項目 or 最後の項目の次のインデックスtkinter.ACTIVE
:アクティブな項目(今注目している項目)のインデックスtkinter.ANCHOR
:select_anchor
メソッドで記録されたインデックス
例えば下記を実行すれば、現在アクティブな項目が表示されます。
print(listbox.get(tkinter.ACTIVE))
アクティブな項目というと分かりにくいのですが、通常は最後にマウスでクリックした項目がこのアクティブな項目となります(タブキーでフォーカスを当てた際にアクティブな項目を変更することも可能)。
点線で囲まれている or 下線が引かれている項目がアクティブな項目になり、上記を実行することで、その項目を表示することができます。このアクティブな項目の見た目は後述で解説する activestyle で設定することも可能です。
また tkinter.END
もちょっと特殊で、このインデックスはメソッドごとに扱いが異なるようです。
例えば下記を実行した場合、get
で取得されるのは “最後の項目” となります。
listbox.get(tkinter.END)
その一方で下記を実行した場合、insert
で追加される項目の位置は “最後の項目の次” になります。
listbox.insert(tkinter.END, "item")
要は、tkinter.END
メソッドごとに “最後の項目のインデックス” もしくは “最後の項目の次のインデックス” のどちらで扱われるかが変わるようです。
ただ、割と直感的に正しい方(使い方として都合が良い方)の扱いで動作してくれるので、あまりこの違いを深く考える必要はないかなぁと思います。
また、上記の3つの他にも "@x,y"
の形式でインデックスを指定することも可能です。この時は、座標 (x
, y
) に一番近いインデックスに置き換えて処理が行われます。
curselection
:選択中の項目のインデックスを取得
それでは、リストボックスウィジェットのメソッドについて解説していきます。
まずは、前述でも登場した curselection
です。
curselection
は選択中の項目のインデックスを取得するメソッドです。
curselection(self)
引数は不要で、実行すれば選択中の項目のインデックスが格納されたタプルを取得することができます。
使用例や注意点等は、前述の 選択中の項目のインデックスを取得する で解説していますので、こちらを参照していただければと思います。
スポンサーリンク
get
:項目を取得
get
は引数で指定したインデックスの項目を取得するメソッドです。
get(self, index)
引数 index
には、取得したい項目のインデックスを指定します。
使用例や注意点等は、前述の インデックスを指定して項目を取得する で解説していますので、こちらを参照していただければと思います。
insert
:項目を追加
insert
はリストボックスに項目を追加するメソッドです。
insert(self, index, *elements)
引数 index
には、項目を追加したい位置のインデックスを、引数 elements
には追加したい項目を指定します。
使用例は、リストボックスの作成 の リストボックスのメソッドを利用する で紹介していますので、こちらを参照していただければと思います。
また、他の使用例として、elements
に複数の項目を一度に指定する使い方が挙げられます。
例えば下記を実行すれば、インデックス 3
〜 5
の位置に、それぞれ "pink"
"orange"
"purple"
という項目を追加することができます。
listbox.insert(3, "pink", "orange", "purple")
上記において、listbox
はリストボックスウィジェット(tkinter.Listbox
のオブジェクト)になります。以降でも、listbox
は事前に作成したリストボックスウィジェットであることを前提に解説させていただきます。
delete
:項目を削除
delete
はリストボックスから項目を削除するメソッドです。
delete(self, first, last=None)
delete
を実行すれば、引数 first
から引数 last
のインデックスの項目が全て削除されます。
last
を省略した場合は、インデックスが first
である項目1つのみが削除されます。
例えば下記は、リストボックスの全ての項目を削除する際の delete
メソッドの使用例になります。
listbox.delete(0, tkinter.END)
スポンサーリンク
select_set
:項目を選択
select_set
はリストボックスの項目を選択するメソッドです。selection_set
も全く同じメソッドになります。
select_set(self, first, last=None)
select_set
を実行すれば、引数 first
から引数 last
のインデックスの項目が全て選択されます。
last
を省略した場合は、インデックスが first
である項目1つのみが選択されます。
例えば下記は、リストボックスの全ての項目を選択する際の select_set
メソッドの使用例になります。
listbox.select_set(0, tkinter.END)
リストボックスウィジェットにおいては、ユーザからマウスで項目をクリックされた際に自動的にその項目が選択されるようになっています。ですので、このような操作の際に、わざわざ select_set
を実行するように処理を記述する必要はありません。
select_set
メソッドは、上記以外の操作が行われた際にも項目の選択を行いたいようなケースにおいて便利なメソッドになります。
例えばボタンを押して全ての項目を一括で選択するような場合、この select_set
を使えば簡単にその処理を実現することができます。
select_clear
:項目の選択を解除
select_clear
はリストボックスの項目を選択を解除するメソッドです。selection_clear
も全く同じメソッドになります。
select_clear(self, first, last=None)
select_clear
を実行すれば、引数 first
から引数 last
のインデックスの項目の選択が全て解除されます。
last
を省略した場合は、インデックスが first
である項目1つのみの選択が解除されます。
例えば下記は、リストボックスの全ての項目の選択を解除する際の select_clear
メソッドの使用例になります。
listbox.select_clear(0, tkinter.END)
select_includes
:項目が選択中であるかの判断
select_includes
は引数で指定したインデックスの項目が選択中であるかどうかを判断するメソッドです。selection_includes
も全く同じメソッドになります。
select_includes(self, index)
引数 index
で指定したインデックスの項目が選択中である場合、select_includes
は True
を返却し、選択中でない場合は False
を返却します。
例えば下記は、インデックスが 1
の項目が選択中であるかどうかを判断する際の、select_includes
メソッドの使用例になります。
if listbox.select_includes(1):
print(listbox.get(1) + "は選択中です")
else:
print(listbox.get(1) + "は選択されていません")
スポンサーリンク
itemconfig
:項目のオプション設定
itemconfig
は引数で指定したインデックスの項目のオプションを設定するメソッドです。itemconfigure
も全く同じメソッドになります。
itemconfig(self, index, **kw)
itemconfig
を実行することで、引数 index
で指定したインデックスの項目に対して kw
によりキーワード指定したオプションを設定することができます。
例えば下記は、インデックスが 1
の項目の背景色を "blue"
に設定する際の、itemconfig
メソッドの使用例になります。
listbox.itemconfig(1, background="blue")
color = listbox.itemcget(1, "background")
print(color)
上記は、background
オプションを指定することで背景色の変更を行なう例になりますが、itemconfig
では他にも下記のオプションを設定することが可能です。
background
:項目の背景色を設定するオプションbg
:background
と同じforeground
:項目の文字色を設定するオプションfg
:foreground
と同じselectbackground
:選択中の時の項目の背景色を設定するオプションselectforeground
:選択中の時の項目の文字色を設定するオプション
itemcget
:項目のオプション取得
itemcget
は引数で指定したインデックスの項目のオプションを取得するメソッドです。
itemcget(self, index, option)
itemcget
を実行することで、引数 index
で指定したインデックスの項目の option
で指定したオプションの設定値を取得することができます。
例えば下記は、インデックスが 1
の項目の背景色を取得する際の、itemcget
メソッドの使用例になります。
listbox.itemconfig(1, background="blue")
color = listbox.itemcget(1, "background")
print(color)
上記では、option
に "background"
を指定することで背景色の取得を行なう例になりますが、itemcget
の option
には、他にも下記のオプションを設定することが可能です。
"background"
:項目の背景色を取得"bg"
:"background"
と同じ"foreground"
:項目の文字色を取得"fg"
:"foreground"
と同じ"selectbackground"
:選択中の時の項目の背景色を取得"selectforeground"
:選択中の時の項目の文字色を取得
ただし、itemconfig
でオプションを設定する前に itemcget
を実行した場合、itemcget
の返却値は必ず空文字になるようなので注意してください。
size
:項目数を取得
size
はリストボックスに存在する項目数を取得するメソッドです。
size(self)
size
メソッド実行時に引数は不要で、戻り値としてリストボックスに存在する項目数を取得することができます。
print(listbox.size())
スポンサーリンク
see
:項目の表示
see
は引数で指定したインデックスの項目が表示されるようにリストボックスを自動スクロールするメソッドです。
see(self, index)
see
メソッドの引数 index
には表示したい項目のインデックスを指定します。
例えば下記は、インデックスが 15
の項目を表示する際の see
メソッドの使用例になります。
listbox.see(15)
下の図が see
メソッドの動作を図示したものになります。
リストボックスの項目には英単語を20個(具体的には 0
〜 19
を英語で表記したもの)を設定しており、左側の図だとインデックス 15
の項目 fifteen
が表示されていないのが確認できると思います。
この状態から listbox.see
を実行した後のリストボックスが右側の図になります。listbox.see
を実行することでリストボックスが自動的にスクロールし、fifteen
が表示されるようになったことが確認できると思います。
nearest
:一番近い項目のインデックスを取得
nearest
は引数で指定した y
座標に一番近い項目のインデックス取得するメソッドです。
nearest(self, y)
nearest
メソッドを使用することで、例えば下記のスクリプトのようにマウスの存在する y
座標から一番近い項目のインデックスを取得し、さらにそのインデックスの項目を自動的に選択するようなことができます。
# -*- coding:utf-8 -*-
import tkinter
def mouse_move(event):
# マウスの位置(y座標)に一番近い項目のインデックスを取得
index = listbox.nearest(event.y)
# そのインデックスの項目を選択
listbox.select_clear(0, tkinter.END) # 一旦全項目の選択解除
listbox.select_set(index)
app = tkinter.Tk()
color_list = [
"red", "green", "blue", "orange", "pink", "purple",
]
color_v = tkinter.StringVar(app, value=color_list)
listbox = tkinter.Listbox(
app,
listvariable=color_v,
)
listbox.pack(padx=20, pady=20)
# マウスが移動した時にmouse_moveを実行するように設定
app.bind("<Motion>", mouse_move)
app.mainloop()
上記で実行している bind
メソッドはイベントの受付の設定を行うためのものになります。
このイベントに関しては下記ページで解説していますので、詳しく知りたい方はこちらをご参照していただければと思います。
Tkinterの使い方:イベント処理を行うbbox
:項目が表示されている位置の取得
bbox
は引数で指定したインデックスの項目の位置(座標)を取得するメソッドです。
bbox(self, index)
bbox
メソッドの引数 index
には、座標を取得したい項目のインデックスを指定します。
bbox
メソッドの戻り値が、そのインデックスの項目が表示されている座標を示すタプルとなります。
このタプルは下記の形式のものになります。
(x, y, width, height)
それぞれの値の意味は下記の通りです(単位は全てピクセル・原点はリストボックスの左上座標)。
x
:その項目の左上の横方向の座標y
:その項目の左上の縦方向の座標width
:その項目の幅height
:その項目の高さ
例えば下記は、インデックスが2
の項目が表示されている座標を取得する際のbbox
メソッドの使用例になります。
print(listbox.bbox(2))
スポンサーリンク
select_anchor
:tkinter.ANCHOR
の記憶
select_anchor
は引数で指定したインデックスを、メソッドに指定可能な特別なインデックス で紹介した tkinter.ANCHOR
に記憶させるメソッドです。selection_anchor
も全く同じメソッドになります。
select_anchor(self, index)
例えば下記は、インデックスが 2
を tkinter.ANCHOR
に記憶させる際の select_anchor
メソッドの使用例になります。
listbox.select_anchor(2)
# インデックス 0 〜 2 の項目が選択される
listbox.select_set(0, tkinter.ANCHOR)
activate
:項目をアクティブ化
activate
は、引数で指定した項目をアクティブにし、さらに tkinter.ACTIVE
に引数で指定したインデックスを記憶させるメソッドです。
activate(self, index)
アクティブな項目は、後述で説明する activestyle オプションで指定した見た目に変化します。
例えば下記は、インデックスが 2
の項目をアクティブにする際の activate
メソッドの使用例になります。
listbox.activate(2)
index
:インデックスの取得
index
は引数で指定したインデックスのインデックスを取得するメソッドです。
index(self, index)
インデックスを指定してインデックスを取得するのでよく分からないメソッドに思えますが、おそらく メソッドに指定可能な特別なインデックス で紹介した tkinter.END
や tkinter.ACTIVE
などが、現在どのインデックスになっているかを調べるために用意されているメソッドだと思います。
例えば下記は、tkinter.ACTIVE
のインデックスを調べる際の index
メソッドの使用例になります。
print(listbox.index(tkinter.ACTIVE))
スポンサーリンク
xview
・yview
:スクロールバーとの連動
リストボックスにはスクロールバーを付けることが可能で、そのスクロールバーと連動するために用意されているのが、この xview
と yview
になります。
スクロールバーについては下記ページで解説していますし、この xview
と yview
を利用したスクロールバー付きのリストボックの作り方についても下記ページの スクロールバー付きのリストボックス で紹介していますので、すみませんが必要に応じて別途こちらのページを参考にしていただければと思います。
リストボックスのオプション
他のウィジェット同様、リストボックスもウィジェット作成時(tkinter.Listbox() 実行時)にオプションを指定することで、リストボックスウィジェットの詳細(見た目など)を設定することが可能です(作成時だけでなく、後から config
メソッドで変更することも可能)。
リストボックスウィジェットに指定可能なオプションの一覧は、下記により表示することが可能です。
# listboxはListboxのインスタンス
print(listbox.keys())
リストボックスウィジェットで指定可能なオプションは、下記ページで解説しているエントリーウィジェットと似ています。
Tkinterの使い方:エントリー(Entry)の使い方特に下記に関しては全く意味合いが同じですので、これらのオプションの解説については、すみませんがエントリーウィジェットの方のオプションの解説を参照していただければと思います(オプション名にリンクを貼っていますので、クリックすればエントリーウィジェットに対する解説が表示されるようになっています)。
- width
- justify
- font
- disabledforeground(リストボックスには
disabledbackground
は無し) - bd(or borderwidth)
- relief
- highlightcolor・highlightbackground・highlightthickness
- cursor
また、下記のオプションについてはリストボックスにスクロールバーを付けるためのものになります。
xscrollcommand
yscrollcommand
これらのオプションを利用したスクロールバー付きのリストボックスの作り方については下記ページの スクロールバー付きのリストボックス で紹介していますので、これらのオプションについて詳しく知りたい方は下記のページを参照していただければと思います。
Tkinterの使い方:スクロールバー(Scrollbar)の使い方このページでは、エントリーウィジェットに存在しない or エントリーウィジェットと意味合いの異なる下記のオプションについて解説していきます。
- listvariable
- selectmode
- height
- state
- bg(or background)・fg(or foreground)
- selectbackground・selectforeground
- selectborderwidth
- activestyle
- takefocus
- exportselection
- setgrid
listvariable
listvariable
はリストボックスウィジェットと連動するウィジェット変数を指定するオプションになります。
ウィジェット変数をご存知ない方は、下記ページで詳細を解説していますのでこちらをご参照していただければと思います。
Tkinterの使い方:ウィジェット変数について解説【StringVar・BooleanVar・IntVar・DoubleVar】このリストボックウィジェットにおいては、ウィジェット変数とウィジェットの連動というよりも、ウィジェットに項目を追加する目的で使用することが多いと思います。
この目的での使用例等は、前述の リストボックスの作成 の ウィジェット変数を利用する で紹介していますので、コチラを参照していただければと思います。
ただし、ウィジェット変数のコンストラクタ実行時に value
にリストを指定した場合、そのウィジェット変数の get
メソッドは使わない方が良いです(特に tkinter.StringVar
型以外のウィジェット変数の場合)。
ウィジェット変数の get
メソッドは、そのウィジェット変数の型に応じたオブジェクトを返却するメソッドになるようで、リストを value
に指定している場合はその型と一致しないため、基本的に get
メソッドを実行するとエラーになると思います。
例えば tkinter.IntVar
型のウィジェット変数が get
メソッドを実行した場合、メソッドは int
型のオブジェクトを返却しようとしますが、実際にこのウィジェット変数が保持しているオブジェクトがリストなので、話が合わなくてエラーになるようです。
tkinter.StringVar
型のウィジェット変数の場合は get
メソッドでエラーは出ないようですが、返却されるオブジェクトは str
型、つまり文字列であり、リストではない点に注意してください。
スポンサーリンク
selectmode
selectmode
は項目の選択の仕方を指定するオプションになります。
selectmode
に指定可能なパラメータは下記の4つになります(ドラッグ操作とはマウスをクリックした状態でマウスカーソルを移動する操作のことを言います)。
tkinter.SINGLE
:- 選択可能な項目は1つのみ
- 選択はマウスのクリックで行う
tkinter.MULTIPLE
:- 選択可能な項目は複数
- 選択および選択の解除はマウスのクリックで行う
tkinter.BROWSE
:- 選択可能な項目は1つのみ
- マウスのドラッグ操作で選択中の項目を移動することができる
- デフォルト設定
tkinter.EXTENDED
:- 選択可能な項目は複数
- マウスのドラッグ操作で選択範囲を広げることができる
tkinter.SINGLE
と tkinter.BROWSE
と tkinter.EXTENDED
の違いがちょっと分かりにくいので、アニメを用いて補足していきたいと思います。
下の図のようなリストボックスウィジェットにおいて、green
の項目をクリックした後にドラッグ操作を行なった際、それぞれの指定に応じて選択中の項目がどのように変化するのかを示していきたいと思います。
まず tkinter.SINGLE
の場合は、下のアニメのように、クリックした後にドラッグ操作を行なっても選択中の項目はずっと green
のままです。選択項目を変更する際には、他の項目をクリックしなければいけません。
tkinter.MULTIPLE
の場合も、ドラッグ操作に関しては同様の動作になりますが、tkinter.SINGLE
とは異なり、クリックにより複数の項目を選択することが可能です(選択中の項目をクリックすれば選択解除される)。
続いて tkinter.BROWSE
の場合、下のアニメのように、クリックした後にドラッグ操作を行えば、マウスの位置に応じて選択中の項目が移動していくことが確認できると思います。
さらに tkinter.EXTENDED
の場合、下のアニメのように、クリックした後にドラッグ操作を行えば、マウスの位置に応じて選択範囲が広がっていくことが確認できると思います。
tkinter.EXTENDED
を指定しておけば複数の項目が選択可能ではありますが、選択可能なのは連続した項目のみで、とびとびで項目を選択したいような場合は tkinter.MULTIPLE
を選択する必要があります。
下記はリストボックスウィジェットの項目の選択の仕方を tkinter.MULTIPLE
に指定する例になります。
listbox = tkinter.Listbox(
app,
selectmode=tkinter.MULTIPLE
)
height
height
はリストボックスウィジェットの高さを指定するオプションになります。
height
には項目の数を指定します。ピクセル数などではないので注意してください。指定した値分の項目が表示されるように、リストボックスウィジェットの高さが調節されます。
下記はリストボックスウィジェットの高さを 5
項目分に指定する例になります。
listbox = tkinter.Listbox(
app,
height=5
)
state
state
はリストボックスウィジェットの状態を指定するオプションになります。
リストボックスウィジェットの state
に指定可能なパラメータは下記の2つになります。
tkinter.NORMAL
:通常状態(デフォルト)tkinter.DISABLED
:無効状態
無効状態のリストボックスウィジェットでは項目の選択ができなくなります。ですので、項目をユーザーに選択して欲しくないようなタイミングでは、state=tkinter.DISABLED
を指定しておくと良いと思います。
下記はリストボックスウィジェットの状態を無効状態に指定する例になります。
listbox = tkinter.Listbox(
app,
state=tkinter.DISABLED
)
スポンサーリンク
bg
(or background
)・fg
(or foreground
)
bg
は通常状態のリストボックスウィジェットの背景色を、fg
は通常状態のリストボックスウィジェットの文字色を指定するオプションです。
background
は bg
と、foreground
は fg
と全く同じオプションになります。
これらのオプションには、色名やカラーコードを指定します。
下記はリストボックスウィジェットの背景色を "blue"
に、文字色を "orange"
に指定する例になります。
listbox = tkinter.Listbox(
app,
bg="blue",
fg="orange"
)
これらのオプションはリストボックスウィジェット全体に対する設定になりますが、リストボックスウィジェットにおいては項目ごとに背景色や文字色を設定することも可能です。
項目ごとに背景色や文字色を設定したい場合は、リストボックスのitemconfig
メソッドを利用します。itemconfig
メソッドに関しては前述の itemconfig で解説していますので、項目ごとにこれらを設定したい場合は コチラ を参照していただければと思います。
selectbackground
・selectforeground
selectbackground
は選択中の項目の背景色を、selectforeground
は選択中の項目の文字色を指定するオプションです。
これらのオプションには、色名やカラーコードを指定します。
下記は選択中の項目の背景色を "blue"
に、文字色を "orange"
に指定する例になります。
listbox = tkinter.Listbox(
app,
selectbackground="blue",
selectforeground="orange"
)
bg
や fg
同様に、これらのオプションも項目ごとに設定することが可能です。項目ごとに設定したい方は、itemconfig メソッドの解説を参照していただければと思います。
selectborderwidth
selectborderwidth
は選択中の項目の囲み線の太さを指定するオプションになります。
selectborderwidth
にはピクセル数を指定します。
下記は選択中の項目の囲み線の太さを 10
px に指定する例になります。
listbox = tkinter.Listbox(
app,
selectborderwidth=10
)
下の図はデフォルト設定と selectborderwidth=10
を指定した時のリストボックスの見た目の違いを示したものになります。
おそらく、選択した項目は、relief
設定でいう tkinter.RAISED
の見た目で表示させるように設定されており、selectborderwidth
を大きくすればより項目が浮き上がって見えるようになるようです(この選択された項目の見た目は設定不可のようです)。
また、選択した項目の周りに存在する点線?は、次に紹介するアクティブであることを示すものになります。この線の太さも selectborderwidth
の指定に連動するようですね…。
スポンサーリンク
activestyle
activestyle
はアクティブな項目の見た目を指定するオプションになります。
activestyle
に指定可能なパラメータは下記の3つになります。
tkinter.DOTBOX
:アクティブな項目の周りに点線を付加するtkinter.UNDERLINE
:アクティブな項目に下線を付加するtkinter.NONE
:何も付加しない(他の項目と同様の見た目のまま)
デフォルトは、私の環境では tkinter.DOTBOX
になっていました。ただ、他のページではデフォルト設定が tkinter.UNDERLINE
になっていると説明されていることもあるので、環境によってデフォルト設定は異なるのかもしれないです。
下記はアクティブな項目の見た目を下線付きに指定する例になります。
listbox = tkinter.Listbox(
app,
acvtivestyle=tkinter.UNDERLINE
)
takefocus
takefocus
はタブキーによるフォーカスの有効無効を指定するオプションになります。
リストボックスウィジェットにおいては、フォーカスをあてることで、そのリストボックスのアクティブな項目をキーボードの矢印キーで動かすことができるようになります。
takefocus
に指定可能なパラメータは下記のようになります。
False
or0
:フォーカスを無効(フォーカスがあてられない)True
or1
:フォーカスを有効(フォーカスがあてられる)(デフォルト)
下記はリストボックスウィジェットへのフォーカスを無効に指定する例になります。
listbox = tkinter.Listbox(
app,
takefocus=False
)
フォーカスをあてて矢印キーを押したときの動作は、selectmode で解説した selectmode
オプションの指定によって異なるので注意してください。
例えば selectmode=tkinter.BROWSE
の場合、矢印キーを押してアクティブな項目の位置を変更すると、それと同時に選択中の項目も移動します。
その一方で、selectmode=tkinter.SINGLE
の場合、矢印キーを押して移動するのはアクティブな項目の位置のみです。スペースキーを押すことで、そのアクティブな項目が初めて選択されることになります。
exportselection
exportselection
は選択中の項目のコピー操作の有効無効を切り替えるオプションになります。
exportselection
には下記の2つのパラメータを指定することが可能です。
Ture
(or1
):コピー操作を有効にするFalse
(or0
):コピー操作を無効にする(デフォルト)
exportselection=True
を指定しておけば、コピーを実行するショーカットキーの押下(Windows では Ctrl + c
、MacOSX では command + c
)や、メニューからのコピー操作により、選択中の項目をクリップボードにコピーすることができます(複数選択している場合は複数の項目がコピーされる)。
下記は選択中の項目のコピー操作を有効に指定する例になります。
listbox = tkinter.Listbox(
app,
exportselection=True
)
スポンサーリンク
setgrid
setgrid
はメインウィンドウのサイズ変更を文字のサイズ単位でのみ行えるように制御するためのオプションになります。
setgrid
には下記の2つのパラメータを指定することが可能です。
Ture
(or1
):メインウィンドウのサイズ変更は文字のサイズ単位のみFalse
(or0
):メインウィンドウのサイズ変更は自由自在(デフォルト)
setgrid=False
の場合、メインウィンドウのサイズ変更は自由自在ですので、下の図のようにウィンドウのサイズによってはリストの項目が中途半端にしか見えない状態になる可能性があります。
その一方で setgrid=True
の場合、メインウィンドウのサイズ変更は文字のサイズ単位でしか行えませんので、上の図のように中途半端にしか文字が表示されるようなサイズには変更されません。
必ず下の図のように、文字全体が見える状態のサイズにしか変更することができなくなります。
下記はメインウィンドウのサイズを文字のサイズ単位でのみ変更可能にする際のオプション指定例になります。
listbox = tkinter.Listbox(
app,
setgrid=True
)
まとめ
このページでは tkinter におけるリストボックスウィジェットについて解説しました!
ユーザーに複数の選択肢を示し、その中からユーザーに項目を選択してもらうようなアプリを作成する際には、このリストボックスウィジェットが便利だと思います。
割とメソッドが活躍するウィジェットだと思いますので、リストボックスを利用する際は、最低限下記のメソッドの使い方は覚えておくと良いと思います!