Tkinterの使い方:リストボックス(Listbox)の使い方

リストボックスの使い方の解説ページアイキャッチ

このページでは tkinter のウィジェットの1つである「リストボックス(Listbox クラス)」の使い方について解説していきます。

MEMO

私の下記環境での実行結果をもとに説明していますが、環境によっては動きが異なるかもしれません

実際にご自身の環境で実行結果を確認していただくと、より確実に設定の効果を理解することができると思います

  • OS:macOS Big Sur
  • Python:3.9.4
  • Tkinter:8.6

リストボックスウィジェット

まずは、リストボックスウィジェットがどのようなウィジェットであるのかについて解説していきます。

リストボックスウィジェットとは

リストボックスは下の図のようなウィジェットになります(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()
MEMO

上記スクリプトで使用している各メソッドについては、それぞれ下記のページで解説していますので、詳しく知りたい方はこれらのページをご参照していただければと思います

上記スクリプトを実行すれば、次の図のようなアプリが起動します。

リストボックスの使用例のスクリプトを実行すると起動するアプリの画面

このアプリには、下の図のようにウィジェットが配置されています。

アプリ上に配置されているウィジェットの説明図

リストボックスに表示されている色の項目一覧から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メソッド
insert(self, index, *elements)

引数 index には項目を追加する位置を指定し(リストボックスの一番上の項目を 0 とした時に上から何番目の位置に追加したいかを指定する)、さらに引数 elements には追加する項目そのものを指定します。

以降では、この index に指定するような、リストボックスの上から何番目の項目であるかを示す番号をインデックスと呼ばせていただきます。

index には tkinter.END という値も指定することも可能で、これを指定することでリストボックスの一番最後に項目を追加することもできます。

ですので、例えばリストボックスに項目 "red""blue""green" を追加したい場合は、次のように処理を行えば良いです。

insertメソッドによる項目の追加
listbox = tkinter.Listbox(
	app, # 親ウィジェット
)

listbox.insert(tkinter.END, "red")
listbox.insert(tkinter.END, "blue")
listbox.insert(tkinter.END, "green")

この insert メソッドを利用すれば、後から何らかのタイミング(例えばボタンが押された時など)に項目を追加することもできますし、逆に項目を削除するようなメソッドも用意されています。

これらのメソッドについては、後述の リストボックスのメソッド で紹介していきます。

選択中の項目の取得

続いて、選択中の項目の取得方法について解説していきます。

この選択中の項目の取得は、下記の2つの手順により実現することができます。

  • 選択中の項目のインデックスを取得する
  • インデックスを指定して項目を取得する

選択中の項目のインデックスを取得する

選択中の項目を取得するためにまず行う必要があるのが、その選択中の項目のインデックスの取得です。

これは、curselection メソッドにより取得することができます。

curselection
curselection(self)

curselection メソッドは引数なしで実行することができ、戻り値は、curselection を実行したリストボックスウィジェット(tkinter.Listbox のオブジェクト)で “選択中の項目のインデックス” が格納されたタプルとなります。

ですので、このタプルの要素を取得することにより、選択中の項目のインデックスを取得することができます。

このタプルの要素数(つまり選択中の項目のインデックスの数)は必ず1つであるとは限らない点に注意してください。

選択中の項目が複数のときに curselection を実行すると、戻り値で取得できるタプルの要素数は複数個になりますし、1つも項目が選択されていないときに curselection を実行すると、戻り値で取得できるタプルは空になります。

MEMO

後述で解説しますが、リストボックスではオプションの指定により項目を複数同時に選択できるようにすることができます

選択中の項目のインデックスが複数の場合も考慮して処理を行いたいような場合は、下記のようにループを形成して、インデックスを1つずつ取得しながら処理をするのが良いと思います。

インデックスが複数の場合を考慮した処理
indices = listbox.curselection()

# indicesから1つ1つ要素を取り出しながらループ
for index in indices:
	# 何らかの処理を実行

選択中の項目のインデックスが1つの場合以外は処理をスキップしたいような場合は、下記のようにタプルの要素数を調べてから処理を実行すれば良いです。

インデックスが1つであることを前提とした処理
indices = listbox.curselection()

# インデックスの数が1つの場合のみ処理を実行
if len(indices) == 1:
	# 何らかの処理を実行

インデックスを指定して項目を取得する

curselection メソッドにより選択中の項目のインデックスが取得できれば、次は目的の “選択中の項目” の取得を行います。

これは、tkinter.Listboxget メソッドにより実現することができます。

getメソッド
get(self, first, last=None)

get メソッドを実行すれば、メソッドを実行したリストボックスウィジェットの first から last のインデックスの項目を取得することができます。last を指定した場合、その項目はタプルに格納された形で取得されることになります。

また、last に関しては省略可能で、この際には first で指定した位置の項目そのものが取得されます(タプルではない)。

したがって、firstcurselection メソッドの戻り値のタプルから取得したインデックスを指定して get メソッドを実行することで、選択中の項目を取得することができます。

例えば下記のように処理を実行すれば、選択中の項目が1つの時に限り、select_item に選択中の項目を格納することができます。

インデックスが1つであることを前提とした項目の取得
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) の場合、インデックスが 155 つの項目全てを取得することになってしまいます(本当に取得したい項目はインデックスが 1253 つの項目のみのはず)。

ですので、複数の項目が飛び飛びで選択される可能性がある場合、前述したようにループを組んで1つ1つのインデックスに対して get を実行する方が無難だと思います。

選択中の項目の取得方法の解説は以上となります。

あとは、この取得した項目に応じて何らかの処理を行うようにすれば、ユーザーからの選択に応じてアプリの動作を切り替えるようなことができるようになります。

例えば リストボックスの使い方 の最初に紹介したアプリでは、その取得した項目を長方形の塗りつぶし色に反映することで、ユーザーからの選択に応じて表示される長方形の色が変化するように動作させています。

スポンサーリンク

リストボックスのメソッド

基本的なリストボックスウィジェットの使い方は前述の通りになります。

ここからは、より詳細なリストボックウィジェットの解説を行なっていきます。

まずは、リストボックスウィジェット(tkinter.Listbox クラス)に用意された、このウィジェット特有のメソッドについて解説していきます。

メソッドに指定可能な特別なインデックス

と、その前に、まずはメソッドに指定可能な特別なインデックスについて紹介しておきます。

リストボックスウィジェットのメソッドにおいては、ここまで紹介してきた getinsert メソッドのように引数でインデックスを指定するものが多いです。

このインデックス指定時には、下記の3つの特別なインデックスを指定することが可能です。

  • tkinter.END:最後の項目 or 最後の項目の次のインデックス
  • tkinter.ACTIVE:アクティブな項目(今注目している項目)のインデックス
  • tkinter.ANCHORselect_anchor メソッドで記録されたインデックス

例えば下記を実行すれば、現在アクティブな項目が表示されます。

tkinter.ACTIVEの使用例
print(listbox.get(tkinter.ACTIVE))

アクティブな項目というと分かりにくいのですが、通常は最後にマウスでクリックした項目がこのアクティブな項目となります(タブキーでフォーカスを当てた際にアクティブな項目を変更することも可能)。

点線で囲まれている or 下線が引かれている項目がアクティブな項目になり、上記を実行することで、その項目を表示することができます。このアクティブな項目の見た目は後述で解説する activestyle で設定することも可能です。

また tkinter.END もちょっと特殊で、このインデックスはメソッドごとに扱いが異なるようです。

例えば下記を実行した場合、get で取得されるのは “最後の項目” となります。

tkinter.ENDの扱い1
listbox.get(tkinter.END)

その一方で下記を実行した場合、insert で追加される項目の位置は “最後の項目の次” になります。

tkinter.ENDの扱い2
listbox.insert(tkinter.END, "item")

要は、tkinter.END メソッドごとに “最後の項目のインデックス” もしくは “最後の項目の次のインデックス” のどちらで扱われるかが変わるようです。

ただ、割と直感的に正しい方(使い方として都合が良い方)の扱いで動作してくれるので、あまりこの違いを深く考える必要はないかなぁと思います。

また、上記の3つの他にも "@x,y" の形式でインデックスを指定することも可能です。この時は、座標 (x, y) に一番近いインデックスに置き換えて処理が行われます。

curselection:選択中の項目のインデックスを取得

それでは、リストボックスウィジェットのメソッドについて解説していきます。

まずは、前述でも登場した curselection です。

curselection は選択中の項目のインデックスを取得するメソッドです。

curselection
curselection(self)

引数は不要で、実行すれば選択中の項目のインデックスが格納されたタプルを取得することができます。

使用例や注意点等は、前述の 選択中の項目のインデックスを取得する で解説していますので、こちらを参照していただければと思います。

スポンサーリンク

get:項目を取得

get は引数で指定したインデックスの項目を取得するメソッドです。

get
get(self, index)

引数 index には、取得したい項目のインデックスを指定します。

使用例や注意点等は、前述の インデックスを指定して項目を取得する で解説していますので、こちらを参照していただければと思います。

insert:項目を追加

insert はリストボックスに項目を追加するメソッドです。

insert
insert(self, index, *elements)

引数 index には、項目を追加したい位置のインデックスを、引数 elements には追加したい項目を指定します。

使用例は、リストボックスの作成リストボックスのメソッドを利用する で紹介していますので、こちらを参照していただければと思います。

また、他の使用例として、elements に複数の項目を一度に指定する使い方が挙げられます。

例えば下記を実行すれば、インデックス 35 の位置に、それぞれ "pink" "orange" "purple" という項目を追加することができます。

elementsに複数の項目を指定する例
listbox.insert(3, "pink", "orange", "purple")

上記において、listbox はリストボックスウィジェット(tkinter.Listbox のオブジェクト)になります。以降でも、listbox は事前に作成したリストボックスウィジェットであることを前提に解説させていただきます。

delete:項目を削除

delete はリストボックスから項目を削除するメソッドです。

delete
delete(self, first, last=None)

delete を実行すれば、引数 first から引数 last のインデックスの項目が全て削除されます。

last を省略した場合は、インデックスが first である項目1つのみが削除されます。

例えば下記は、リストボックスの全ての項目を削除する際の delete メソッドの使用例になります。

deleteの使用例
listbox.delete(0, tkinter.END)

スポンサーリンク

select_set:項目を選択

select_set はリストボックスの項目を選択するメソッドです。selection_set も全く同じメソッドになります。

select_set
select_set(self, first, last=None)

select_set を実行すれば、引数 first から引数 last のインデックスの項目が全て選択されます。

last を省略した場合は、インデックスが first である項目1つのみが選択されます。

例えば下記は、リストボックスの全ての項目を選択する際の select_set メソッドの使用例になります。

select_setの使用例
listbox.select_set(0, tkinter.END)

リストボックスウィジェットにおいては、ユーザからマウスで項目をクリックされた際に自動的にその項目が選択されるようになっています。ですので、このような操作の際に、わざわざ select_set を実行するように処理を記述する必要はありません。

select_set メソッドは、上記以外の操作が行われた際にも項目の選択を行いたいようなケースにおいて便利なメソッドになります。

例えばボタンを押して全ての項目を一括で選択するような場合、この select_set を使えば簡単にその処理を実現することができます。

select_clear:項目の選択を解除

select_clear はリストボックスの項目を選択を解除するメソッドです。selection_clear も全く同じメソッドになります。

select_clear
select_clear(self, first, last=None)

select_clear を実行すれば、引数 first から引数 last のインデックスの項目の選択が全て解除されます。

last を省略した場合は、インデックスが first である項目1つのみの選択が解除されます。

例えば下記は、リストボックスの全ての項目の選択を解除する際の select_clear メソッドの使用例になります。

select_clearの使用例
listbox.select_clear(0, tkinter.END)

select_includes:項目が選択中であるかの判断

select_includes は引数で指定したインデックスの項目が選択中であるかどうかを判断するメソッドです。selection_includes も全く同じメソッドになります。

select_includes
select_includes(self, index)

引数 index で指定したインデックスの項目が選択中である場合、select_includesTrue を返却し、選択中でない場合は False を返却します。

例えば下記は、インデックスが 1 の項目が選択中であるかどうかを判断する際の、select_includes メソッドの使用例になります。

select_includesの使用例
if listbox.select_includes(1):
	print(listbox.get(1) + "は選択中です")
else:
	print(listbox.get(1) + "は選択されていません")

スポンサーリンク

itemconfig:項目のオプション設定

itemconfig は引数で指定したインデックスの項目のオプションを設定するメソッドです。itemconfigure も全く同じメソッドになります。

itemconfig
itemconfig(self, index, **kw)

itemconfig を実行することで、引数 index で指定したインデックスの項目に対して kw によりキーワード指定したオプションを設定することができます。

例えば下記は、インデックスが 1 の項目の背景色を "blue" に設定する際の、itemconfig メソッドの使用例になります。

itemconfigの使用例
listbox.itemconfig(1, background="blue")

color = listbox.itemcget(1, "background")
print(color)

上記は、background オプションを指定することで背景色の変更を行なう例になりますが、itemconfig では他にも下記のオプションを設定することが可能です。

  • background:項目の背景色を設定するオプション
  • bgbackground と同じ
  • foreground:項目の文字色を設定するオプション
  • fgforeground と同じ
  • selectbackground:選択中の時の項目の背景色を設定するオプション
  • selectforeground:選択中の時の項目の文字色を設定するオプション

itemcget:項目のオプション取得

itemcget は引数で指定したインデックスの項目のオプションを取得するメソッドです。

itemcget
itemcget(self, index, option)

itemcget を実行することで、引数 index で指定したインデックスの項目の option で指定したオプションの設定値を取得することができます。

例えば下記は、インデックスが 1 の項目の背景色を取得する際の、itemcget メソッドの使用例になります。

itemcgetの使用例
listbox.itemconfig(1, background="blue")

color = listbox.itemcget(1, "background")
print(color)

上記では、option"background" を指定することで背景色の取得を行なう例になりますが、itemcgetoption には、他にも下記のオプションを設定することが可能です。

  • "background":項目の背景色を取得
  • "bg""background" と同じ
  • "foreground":項目の文字色を取得
  • "fg""foreground" と同じ
  • "selectbackground":選択中の時の項目の背景色を取得
  • "selectforeground":選択中の時の項目の文字色を取得

ただし、itemconfig でオプションを設定する前に itemcget を実行した場合、itemcget の返却値は必ず空文字になるようなので注意してください。

size:項目数を取得

size はリストボックスに存在する項目数を取得するメソッドです。

size
size(self)

size メソッド実行時に引数は不要で、戻り値としてリストボックスに存在する項目数を取得することができます。

sizeの使用例
print(listbox.size())

スポンサーリンク

see:項目の表示

see は引数で指定したインデックスの項目が表示されるようにリストボックスを自動スクロールするメソッドです。

see
see(self, index)

see メソッドの引数 index には表示したい項目のインデックスを指定します。

例えば下記は、インデックスが 15 の項目を表示する際の see メソッドの使用例になります。

seeの使用例
listbox.see(15)

下の図が see メソッドの動作を図示したものになります。

seeメソッドの動作の説明図

リストボックスの項目には英単語を20個(具体的には 019 を英語で表記したもの)を設定しており、左側の図だとインデックス 15 の項目 fifteen が表示されていないのが確認できると思います。

この状態から listbox.see を実行した後のリストボックスが右側の図になります。listbox.see を実行することでリストボックスが自動的にスクロールし、fifteen が表示されるようになったことが確認できると思います。

nearest:一番近い項目のインデックスを取得

nearest は引数で指定した y 座標に一番近い項目のインデックス取得するメソッドです。

nearest
nearest(self, y)

nearest メソッドを使用することで、例えば下記のスクリプトのようにマウスの存在する y 座標から一番近い項目のインデックスを取得し、さらにそのインデックスの項目を自動的に選択するようなことができます。

nearestの使用例
# -*- 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
bbox(self, index)

bbox メソッドの引数 index には、座標を取得したい項目のインデックスを指定します。

bbox メソッドの戻り値が、そのインデックスの項目が表示されている座標を示すタプルとなります。

このタプルは下記の形式のものになります。

(x, y, width, height)

それぞれの値の意味は下記の通りです(単位は全てピクセル・原点はリストボックスの左上座標)。

  • x:その項目の左上の横方向の座標
  • y:その項目の左上の縦方向の座標
  • width:その項目の幅
  • height:その項目の高さ
    bboxで得られるタプルの各要素の意味を示す図

例えば下記は、インデックスが2 の項目が表示されている座標を取得する際のbbox メソッドの使用例になります。

bboxの使用例
print(listbox.bbox(2))

スポンサーリンク

select_anchortkinter.ANCHOR の記憶

select_anchor は引数で指定したインデックスを、メソッドに指定可能な特別なインデックス で紹介した tkinter.ANCHOR に記憶させるメソッドです。selection_anchor も全く同じメソッドになります。

select_anchor
select_anchor(self, index)

例えば下記は、インデックスが 2tkinter.ANCHOR に記憶させる際の select_anchor メソッドの使用例になります。

select_anchorの使用例
listbox.select_anchor(2)

# インデックス 0 〜 2 の項目が選択される
listbox.select_set(0, tkinter.ANCHOR)

activate:項目をアクティブ化

activate は、引数で指定した項目をアクティブにし、さらに tkinter.ACTIVE に引数で指定したインデックスを記憶させるメソッドです。

activate
activate(self, index)

アクティブな項目は、後述で説明する activestyle オプションで指定した見た目に変化します。

例えば下記は、インデックスが 2 の項目をアクティブにする際の activate メソッドの使用例になります。

activateの使用例
listbox.activate(2)

index:インデックスの取得

index は引数で指定したインデックスのインデックスを取得するメソッドです。

index
index(self, index)

インデックスを指定してインデックスを取得するのでよく分からないメソッドに思えますが、おそらく メソッドに指定可能な特別なインデックス で紹介した tkinter.END や tkinter.ACTIVE などが、現在どのインデックスになっているかを調べるために用意されているメソッドだと思います。

例えば下記は、tkinter.ACTIVE のインデックスを調べる際の index メソッドの使用例になります。

indexの使用例
print(listbox.index(tkinter.ACTIVE))

スポンサーリンク

xviewyview:スクロールバーとの連動

リストボックスにはスクロールバーを付けることが可能で、そのスクロールバーと連動するために用意されているのが、この xviewyview になります。

スクロールバーについては下記ページで解説していますし、この xviewyview を利用したスクロールバー付きのリストボックの作り方についても下記ページの スクロールバー付きのリストボックス で紹介していますので、すみませんが必要に応じて別途こちらのページを参考にしていただければと思います。

スクロールバーの作成方法解説ページアイキャッチTkinterの使い方:スクロールバー(Scrollbar)の使い方

リストボックスのオプション

他のウィジェット同様、リストボックスもウィジェット作成時(tkinter.Listbox() 実行時)にオプションを指定することで、リストボックスウィジェットの詳細(見た目など)を設定することが可能です(作成時だけでなく、後から config メソッドで変更することも可能)。

リストボックスウィジェットに指定可能なオプションの一覧は、下記により表示することが可能です。

指定可能なオプションの一覧
# listboxはListboxのインスタンス
print(listbox.keys())

リストボックスウィジェットで指定可能なオプションは、下記ページで解説しているエントリーウィジェットと似ています。

エントリーウィジェットの説明ページアイキャッチTkinterの使い方:エントリー(Entry)の使い方

特に下記に関しては全く意味合いが同じですので、これらのオプションの解説については、すみませんがエントリーウィジェットの方のオプションの解説を参照していただければと思います(オプション名にリンクを貼っていますので、クリックすればエントリーウィジェットに対する解説が表示されるようになっています)。

また、下記のオプションについてはリストボックスにスクロールバーを付けるためのものになります。

  • xscrollcommand
  • yscrollcommand

これらのオプションを利用したスクロールバー付きのリストボックスの作り方については下記ページの スクロールバー付きのリストボックス で紹介していますので、これらのオプションについて詳しく知りたい方は下記のページを参照していただければと思います。

スクロールバーの作成方法解説ページアイキャッチTkinterの使い方:スクロールバー(Scrollbar)の使い方

このページでは、エントリーウィジェットに存在しない or エントリーウィジェットと意味合いの異なる下記のオプションについて解説していきます。

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.SINGLEtkinter.BROWSEtkinter.EXTENDED の違いがちょっと分かりにくいので、アニメを用いて補足していきたいと思います。

下の図のようなリストボックスウィジェットにおいて、green の項目をクリックした後にドラッグ操作を行なった際、それぞれの指定に応じて選択中の項目がどのように変化するのかを示していきたいと思います。

selectmodeの違いによる動作の違いを示すためのリストボックス

まず tkinter.SINGLE の場合は、下のアニメのように、クリックした後にドラッグ操作を行なっても選択中の項目はずっと green のままです。選択項目を変更する際には、他の項目をクリックしなければいけません。

selectmode=tkinter.SINGLEの時の選択のされ方を示すアニメ

tkinter.MULTIPLE の場合も、ドラッグ操作に関しては同様の動作になりますが、tkinter.SINGLE とは異なり、クリックにより複数の項目を選択することが可能です(選択中の項目をクリックすれば選択解除される)。

続いて tkinter.BROWSE の場合、下のアニメのように、クリックした後にドラッグ操作を行えば、マウスの位置に応じて選択中の項目が移動していくことが確認できると思います。

selectmode=tkinter.BROWSEの時の選択のされ方を示すアニメ

さらに tkinter.EXTENDED の場合、下のアニメのように、クリックした後にドラッグ操作を行えば、マウスの位置に応じて選択範囲が広がっていくことが確認できると思います。

selectmode=tkinter.EXTENDEDの時の選択のされ方を示すアニメ

tkinter.EXTENDED を指定しておけば複数の項目が選択可能ではありますが、選択可能なのは連続した項目のみで、とびとびで項目を選択したいような場合は tkinter.MULTIPLE を選択する必要があります。

下記はリストボックスウィジェットの項目の選択の仕方を tkinter.MULTIPLE に指定する例になります。

selectmodeの指定例
listbox = tkinter.Listbox(
	app,
	selectmode=tkinter.MULTIPLE
)

height

height はリストボックスウィジェットの高さを指定するオプションになります。

heightオプションの効果を示す図

height には項目の数を指定します。ピクセル数などではないので注意してください。指定した値分の項目が表示されるように、リストボックスウィジェットの高さが調節されます。

下記はリストボックスウィジェットの高さを 5 項目分に指定する例になります。

heightの指定例
listbox = tkinter.Listbox(
	app,
	height=5
)

state

state はリストボックスウィジェットの状態を指定するオプションになります。

リストボックスウィジェットの state に指定可能なパラメータは下記の2つになります。

  • tkinter.NORMAL:通常状態(デフォルト)
  • tkinter.DISABLED:無効状態

無効状態のリストボックスウィジェットでは項目の選択ができなくなります。ですので、項目をユーザーに選択して欲しくないようなタイミングでは、state=tkinter.DISABLED を指定しておくと良いと思います。

下記はリストボックスウィジェットの状態を無効状態に指定する例になります。

stateの指定例
listbox = tkinter.Listbox(
	app,
	state=tkinter.DISABLED
)

スポンサーリンク

bg(or background)・fg(or foreground

bg は通常状態のリストボックスウィジェットの背景色を、fg は通常状態のリストボックスウィジェットの文字色を指定するオプションです。

backgroundbg と、foregroundfg と全く同じオプションになります。 

bgとfgオプションの効果を示す図

これらのオプションには、色名やカラーコードを指定します。

下記はリストボックスウィジェットの背景色を "blue" に、文字色を "orange"に指定する例になります。

bgとfgの指定例
listbox = tkinter.Listbox(
	app,
	bg="blue",
	fg="orange"
)

これらのオプションはリストボックスウィジェット全体に対する設定になりますが、リストボックスウィジェットにおいては項目ごとに背景色や文字色を設定することも可能です。

項目ごとに背景色や文字色を設定したい場合は、リストボックスのitemconfig メソッドを利用します。itemconfig メソッドに関しては前述の itemconfig で解説していますので、項目ごとにこれらを設定したい場合は コチラ を参照していただければと思います。

itemconfigメソッドにより項目ごとに色を設定できることを示した図

selectbackgroundselectforeground

selectbackground は選択中の項目の背景色を、selectforeground は選択中の項目の文字色を指定するオプションです。

selectbackgroundとselectforegroundの効果を示す図

これらのオプションには、色名やカラーコードを指定します。

下記は選択中の項目の背景色を "blue" に、文字色を "orange" に指定する例になります。

selectbackgroundとselectforegroundの指定例
listbox = tkinter.Listbox(
	app,
	selectbackground="blue",
	selectforeground="orange"
)

bgfg 同様に、これらのオプションも項目ごとに設定することが可能です。項目ごとに設定したい方は、itemconfig メソッドの解説を参照していただければと思います。

selectborderwidth

selectborderwidth は選択中の項目の囲み線の太さを指定するオプションになります。

selectborderwidthオプションの効果を示す図

selectborderwidth にはピクセル数を指定します。

下記は選択中の項目の囲み線の太さを 10 px に指定する例になります。

selectborderwidthの指定例
listbox = tkinter.Listbox(
	app,
	selectborderwidth=10
)

下の図はデフォルト設定と selectborderwidth=10 を指定した時のリストボックスの見た目の違いを示したものになります。

selectborderwidthを指定した時の見た目

おそらく、選択した項目は、relief 設定でいう tkinter.RAISED の見た目で表示させるように設定されており、selectborderwidth を大きくすればより項目が浮き上がって見えるようになるようです(この選択された項目の見た目は設定不可のようです)。

また、選択した項目の周りに存在する点線?は、次に紹介するアクティブであることを示すものになります。この線の太さも selectborderwidth の指定に連動するようですね…。

スポンサーリンク

activestyle

activestyle はアクティブな項目の見た目を指定するオプションになります。

activestyleオプションの効果を示す図

activestyle に指定可能なパラメータは下記の3つになります。

  • tkinter.DOTBOX:アクティブな項目の周りに点線を付加する
  • tkinter.UNDERLINE:アクティブな項目に下線を付加する
  • tkinter.NONE:何も付加しない(他の項目と同様の見た目のまま)

デフォルトは、私の環境では tkinter.DOTBOX になっていました。ただ、他のページではデフォルト設定が tkinter.UNDERLINE になっていると説明されていることもあるので、環境によってデフォルト設定は異なるのかもしれないです。

下記はアクティブな項目の見た目を下線付きに指定する例になります。

activestyleの指定例
listbox = tkinter.Listbox(
	app,
	acvtivestyle=tkinter.UNDERLINE
)

takefocus

takefocus はタブキーによるフォーカスの有効無効を指定するオプションになります。

リストボックスウィジェットにおいては、フォーカスをあてることで、そのリストボックスのアクティブな項目をキーボードの矢印キーで動かすことができるようになります。

takefocus に指定可能なパラメータは下記のようになります。

  • False or 0:フォーカスを無効(フォーカスがあてられない)
  • True or 1:フォーカスを有効(フォーカスがあてられる)(デフォルト)

下記はリストボックスウィジェットへのフォーカスを無効に指定する例になります。

takefocusの指定例
listbox = tkinter.Listbox(
	app,
	takefocus=False
)

フォーカスをあてて矢印キーを押したときの動作は、selectmode で解説した selectmode オプションの指定によって異なるので注意してください。

例えば selectmode=tkinter.BROWSE の場合、矢印キーを押してアクティブな項目の位置を変更すると、それと同時に選択中の項目も移動します。

その一方で、selectmode=tkinter.SINGLE の場合、矢印キーを押して移動するのはアクティブな項目の位置のみです。スペースキーを押すことで、そのアクティブな項目が初めて選択されることになります。

exportselection

exportselection は選択中の項目のコピー操作の有効無効を切り替えるオプションになります。

exportselection には下記の2つのパラメータを指定することが可能です。

  • Ture(or 1):コピー操作を有効にする
  • False(or 0):コピー操作を無効にする(デフォルト)

exportselection=True を指定しておけば、コピーを実行するショーカットキーの押下(Windows では Ctrl + c、MacOSX では command + c)や、メニューからのコピー操作により、選択中の項目をクリップボードにコピーすることができます(複数選択している場合は複数の項目がコピーされる)。

下記は選択中の項目のコピー操作を有効に指定する例になります。

exportselectionの指定例
listbox = tkinter.Listbox(
	app,
	exportselection=True
)

スポンサーリンク

setgrid

setgrid はメインウィンドウのサイズ変更を文字のサイズ単位でのみ行えるように制御するためのオプションになります。

setgrid には下記の2つのパラメータを指定することが可能です。

  • Ture(or 1):メインウィンドウのサイズ変更は文字のサイズ単位のみ
  • False(or 0):メインウィンドウのサイズ変更は自由自在(デフォルト)

setgrid=False の場合、メインウィンドウのサイズ変更は自由自在ですので、下の図のようにウィンドウのサイズによってはリストの項目が中途半端にしか見えない状態になる可能性があります。

seetgrid=Falseの時のウィンドウのサイズ変更の様子を示す図

その一方で setgrid=True の場合、メインウィンドウのサイズ変更は文字のサイズ単位でしか行えませんので、上の図のように中途半端にしか文字が表示されるようなサイズには変更されません。

必ず下の図のように、文字全体が見える状態のサイズにしか変更することができなくなります。

seetgrid=Trueの時のウィンドウのサイズ変更の様子を示す図

下記はメインウィンドウのサイズを文字のサイズ単位でのみ変更可能にする際のオプション指定例になります。

setgridの指定例
listbox = tkinter.Listbox(
	app,
	setgrid=True
)

まとめ

このページでは tkinter におけるリストボックスウィジェットについて解説しました!

ユーザーに複数の選択肢を示し、その中からユーザーに項目を選択してもらうようなアプリを作成する際には、このリストボックスウィジェットが便利だと思います。

割とメソッドが活躍するウィジェットだと思いますので、リストボックスを利用する際は、最低限下記のメソッドの使い方は覚えておくと良いと思います!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です