PythonのGUIライブラリであるtkinterには、さまざまなウィジェットが用意されていますが、その中でもListboxはリストやアイテムを表示できるウィジェットになります。
この記事では、Listboxの基本的な使い方を紹介します。
この記事の対象
Listboxとは?
Listboxは要素を羅列したい場合などに使用されるウィジェットになります。
例えば、フォルダ内のファイル一覧などを取得して可視化したい場合に使用できます。
基本的な型
import tkinter as tk
root = tk.Tk()
root.title("Listbox")
lb_out = tk.Listbox(root)
lb_out.insert(1,"Test")
lb_out.pack()
root.mainloop()
基本的にはListboxを配置して、要素をinsertメソッドで追加していきます。
Listboxの使用例
要素を追加
Listboxに要素を追加するには、insert
メソッドを使用します。
import tkinter as tk
root = tk.Tk()
root.title("Listbox")
lb_out = tk.Listbox(root)
lb_out.insert(1,"Test")
lb_out.insert(2,"Hoge")
lb_out.pack()
root.mainloop()
結果
選択した要素の取得
選択されたアイテムを取得するには、curselection()
メソッドを使用します。
import tkinter as tk
def show_selected_item():
selected_items = lb_out.curselection()
if selected_items:
selected_index = selected_items[0]
selected_item = lb_out.get(selected_index)
label.config(text=f"選択したアイテム: {selected_item}")
else:
label.config(text="アイテムが選択されていません")
root = tk.Tk()
root.title("Listbox")
# Listboxを作成し、アイテムを追加
lb_out = tk.Listbox(root)
lb_out.insert(1, "Item 1")
lb_out.insert(2, "Item 2")
lb_out.insert(3, "Item 3")
lb_out.grid(row=0, column=0, padx=10, pady=10, columnspan=2, sticky='we')
# ボタンを作成し、クリック時に選択したアイテムを表示
button = tk.Button(root, text="表示", command=show_selected_item)
button.grid(row=1, column=0, padx=10, pady=10)
# 選択したアイテムを表示するラベル
label = tk.Label(root, text="ここに選択したアイテムが表示されます")
label.grid(row=1, column=1, padx=10, pady=10)
root.mainloop()
結果
イベントハンドラの追加
ユーザーの操作に応じて処理を実行するには、Listboxにイベントハンドラを追加します。
import tkinter as tk
def on_listbox_select(event):
selected_items = lb_out.curselection()
if selected_items:
selected_index = selected_items[0]
selected_item = lb_out.get(selected_index)
label.config(text=f"選択したアイテム: {selected_item}")
else:
label.config(text="アイテムが選択されていません")
root = tk.Tk()
root.title("Listbox")
# Listboxを作成し、アイテムを追加
lb_out = tk.Listbox(root)
lb_out.insert(1, "Item 1")
lb_out.insert(2, "Item 2")
lb_out.insert(3, "Item 3")
lb_out.grid(row=0, column=0, padx=10, pady=10, columnspan=2, sticky='we')
# Listboxの選択イベントに対するハンドラを設定
lb_out.bind("<<ListboxSelect>>", on_listbox_select)
# 選択したアイテムを表示するラベル
label = tk.Label(root, text="ここに選択したアイテムが表示されます")
label.grid(row=1, column=0, padx=10, pady=10, columnspan=2)
root.mainloop()
結果
Listbox内でスクロールする
Listboxに多数のアイテムがある場合、スクロールが必要です。これはScrollbar
ウィジェットと組み合わせて行います。
import tkinter as tk
def on_listbox_select(event):
selected_items = lb_out.curselection()
if selected_items:
selected_index = selected_items[0]
selected_item = lb_out.get(selected_index)
label.config(text=f"選択したアイテム: {selected_item}")
else:
label.config(text="アイテムが選択されていません")
root = tk.Tk()
root.title("Listbox with Scrollbar")
# スクロールバーの作成
scrollbar = tk.Scrollbar(root)
scrollbar.grid(row=0, column=1, sticky='ns')
# Listboxを作成し、アイテムを追加
lb_out = tk.Listbox(root, yscrollcommand=scrollbar.set)
for i in range(1, 101): # 1から100までのアイテムを追加
lb_out.insert(tk.END, f"Item {i}")
lb_out.grid(row=0, column=0, padx=10, pady=10)
# スクロールバーにListboxを関連付け
scrollbar.config(command=lb_out.yview)
# Listboxの選択イベントに対するハンドラを設定
lb_out.bind("<<ListboxSelect>>", on_listbox_select)
# 選択したアイテムを表示するラベル
label = tk.Label(root, text="ここに選択したアイテムが表示されます")
label.grid(row=1, column=0, padx=10, pady=10, columnspan=2)
root.mainloop()
結果
Listboxから要素を削除
Listboxからアイテムを削除するには、delete
メソッドを使用します。
lb_out.delete(0) # インデックス0のアイテムを削除
Listboxを無効
Listboxを無効にすると、ユーザーが選択や操作を行えなくなります。無効にするには、configure
メソッドを使用します。
lb_out.configure(state=tk.DISABLED)
以下では、これまでのプログラムに上記の機能を追加しています。ボタンを押して、Listboxの有効/無効を切り替えられるようにしています。
import tkinter as tk
def on_listbox_select(event):
selected_items = lb_out.curselection()
if selected_items:
selected_index = selected_items[0]
selected_item = lb_out.get(selected_index)
label.config(text=f"選択したアイテム: {selected_item}")
else:
label.config(text="アイテムが選択されていません")
def toggle_listbox_state():
current_state = lb_out.cget("state")
if current_state == tk.NORMAL:
lb_out.config(state=tk.DISABLED)
toggle_button.config(text="Listboxを有効化")
else:
lb_out.config(state=tk.NORMAL)
toggle_button.config(text="Listboxを無効化")
root = tk.Tk()
root.title("Listbox with Scrollbar")
# スクロールバーの作成
scrollbar = tk.Scrollbar(root)
scrollbar.grid(row=0, column=1, sticky='ns')
# Listboxを作成し、アイテムを追加
lb_out = tk.Listbox(root, yscrollcommand=scrollbar.set)
for i in range(1, 101): # 1から100までのアイテムを追加
lb_out.insert(tk.END, f"Item {i}")
lb_out.grid(row=0, column=0, padx=10, pady=10)
# スクロールバーにListboxを関連付け
scrollbar.config(command=lb_out.yview)
# Listboxの選択イベントに対するハンドラを設定
lb_out.bind("<<ListboxSelect>>", on_listbox_select)
# 選択したアイテムを表示するラベル
label = tk.Label(root, text="ここに選択したアイテムが表示されます")
label.grid(row=1, column=0, padx=10, pady=10, columnspan=2)
# Listboxの有効/無効を切り替えるボタン
toggle_button = tk.Button(root, text="Listboxを無効化", command=toggle_listbox_state)
toggle_button.grid(row=2, column=0, padx=10, pady=10, columnspan=2)
root.mainloop()
結果
Listboxのスタイルをカスタマイズ
Listboxの見た目をカスタマイズするには、configを用いてフォントや背景色などのスタイルを設定可能です。
以下では、設定ファイル 「Listboxconfig.ini」 から色やフォントの情報を読み取り、それに基づいて Listbox の見た目をカスタマイズしています。configparserについては以下をご参照下さい。
>>>「CSV」ファイルの読み込み・書き込み操作方法とiniファイルの読込み方法
import tkinter as tk
from tkinter import ttk
import configparser
def on_listbox_select(event):
selected_items = lb_out.curselection()
if selected_items:
selected_index = selected_items[0]
selected_item = lb_out.get(selected_index)
label.config(text=f"選択したアイテム: {selected_item}")
else:
label.config(text="アイテムが選択されていません")
def toggle_listbox_state():
current_state = lb_out.cget("state")
if current_state == tk.NORMAL:
lb_out.config(state=tk.DISABLED)
toggle_button.config(text="Listboxを有効化")
else:
lb_out.config(state=tk.NORMAL)
toggle_button.config(text="Listboxを無効化")
def load_config():
config = configparser.ConfigParser()
config.read('Listboxconfig.ini', encoding='utf-8')
lb_bg_color = config['ListboxStyle']['BackgroundColor']
lb_fonts = config['ListboxStyle']['Font']
lb_out.config(bg=lb_bg_color, font=(lb_fonts,13))
root = tk.Tk()
root.title("Listbox with Scrollbar")
# スクロールバーの作成
scrollbar = tk.Scrollbar(root)
scrollbar.grid(row=0, column=1, sticky='ns')
# Listboxを作成し、アイテムを追加
lb_out = tk.Listbox(root, yscrollcommand=scrollbar.set)
for i in range(1, 101): # 1から100までのアイテムを追加
lb_out.insert(tk.END, f"Item {i}")
lb_out.grid(row=0, column=0, padx=10, pady=10)
# スクロールバーにListboxを関連付け
scrollbar.config(command=lb_out.yview)
# Listboxの選択イベントに対するハンドラを設定
lb_out.bind("<<ListboxSelect>>", on_listbox_select)
# 選択したアイテムを表示するラベル
label = tk.Label(root, text="ここに選択したアイテムが表示されます")
label.grid(row=1, column=0, padx=10, pady=10, columnspan=2)
# Listboxの有効/無効を切り替えるボタン
toggle_button = tk.Button(root, text="Listboxを無効化", command=toggle_listbox_state)
toggle_button.grid(row=2, column=0, padx=10, pady=10, columnspan=2)
load_config() # 設定ファイルから見た目をカスタマイズ
root.mainloop()
結果
【補足】使用したiniファイル
[ListboxStyle]
BackgroundColor = lightgray
Font = Helvetica
まとめ
Python tkinterのListboxは多くのGUIアプリケーションで使用される重要なウィジェットです。これらの基本的な使用方法を理解し、Listboxを効果的に活用してみて下さい。
これからPythonでアプリ開発を行う方には以下の書籍がおすすめです。Tkinterではないですが、分かりやすいです。