【Python】Tkinterのリストボックス項目で選択された項目の色を変える方法

Python

本記事では、Tkinterのリストボックスで、項目が選択された際に項目の文字色や背景色を変更する方法を解説します。

「項目が選択されたら処理を行う」はイベントで実装する

まず前提として、

  • リストボックスの項目が選択されたら文字色を変える
  • ボタンが押されたら検索処理を実行する

など、部品に対して何かしらの変更がされたときに処理を行うことを「イベント処理」といいます。「〇分経過したら」とか、「メールが受信されたら」などもイベント処理にあたります。

具体的には、作成したリストボックスに対して、bindメソッドでイベントの紐づけを行います。

sample_list = tkinter.Listbox( listvariable=var)
sample_list .bind(‘<<ListboxSelect>>’, list_selected)

詳しくは以下記事にて解説しています。

リストボックス選択行の色を変更する方法

前項を踏まえて、リストボックスが選択されたらその項目の色を変更する処理を作成していきます。イベント発火時に行う処理は以下になります。

# リストボックスが選択されたときの処理
def list_selected(event):
    selected_index = input_list.curselection()
    if selected_index:
        index = 0
        for item in list_val:
            input_list.itemconfig(index, bg='', foreground='')
            index += 1
    # 選択行の色を変更
    input_list.itemconfig(selected_index, bg='blue', foreground='white')

処理の概要

いったんデフォルトに戻してから色を変更する

itemconfigメソッドでは、一度設定した部品の設定内容を変更することができます。

input_list.itemconfig(index, bg='', foreground='')

この処理を入れておかないと、過去に選択した項目がそのままになっていまいます。

itemconfigの引数のbg(背景色)、foreground(文字色)に何も設定しないことで、デフォルト値に戻すことができます。一度全ての項目の色をデフォルトに戻した後、再度itemconfigメソッドを用いて文字色と背景色を設定しています。

input_list.itemconfig(selected_index, bg='blue', foreground='white')

色の名称は、blue、whiteのように英語名を指定しても、16進数のカラーコード(#faf0e6 など)を指定してもOKです。カラーコードはカラーピッカーを使うと微調整しながら好みの色を作れます。

for文に設定するオブジェクトについて

for文には、リストや辞書など、要素を1つずつ取り出せるもの(イテラブルオブジェクト)を入れる必要があります。なので、tkinter.Listboxを設定してもforループを回すことはできません。要素数を取得するようなメソッドも調べた限り見つかりませんでした。

そのため、リストボックスの中身である

list_val = ("りんご", "みかん", "バナナ", "ぶどう", "なし")

配列でforループを回し、indexで配列の位置インデックスを管理しています。なお、以下のようにenumerate()を使用しても同様の操作ができます。

for item, x in enumerate(list_val):
	input_list.itemconfig(item, bg='', foreground='')

選択行の文字色・背景色を変更するソースコード

リストボックスの項目が選択されたら、該当行の文字色・背景色を変更するソースコードは以下になります。コピペOKです。

# ウインドウの作成
import tkinter

root = tkinter.Tk()
root.title("テスト")
root.geometry("400x250")


# リストボックスが選択されたときの処理
def list_selected(event):
    selected_index = input_list.curselection()
    if selected_index:
        for item, x in enumerate(list_val):
            # いったん全ての項目の色を元に戻す
            input_list.itemconfig(item, bg='', foreground='')
    # 選択行の色を変更
    input_list.itemconfig(selected_index, bg='blue', foreground='white')


# リストボックス
list_val = ("りんご", "みかん", "バナナ", "ぶどう", "なし")
var = tkinter.StringVar(value=list_val)
input_list = tkinter.Listbox(selectmode="single", selectbackground="blue", listvariable=var, height=10,
width=60)
input_list.bind('<<ListboxSelect>>', list_selected)
input_list.grid(row=2, column=4, padx=10, pady=10)

# 画面の表示
root.mainloop()

Tkinter.Listboxの要素数を取得するもっとスマートな方法があれば、教えていただきたいです・・・!

まとめ

今回は、Tkinterのリストボックスで、項目が選択された際に項目の文字色や背景色を変更する方法について紹介しました。

普段あまりGUIを作成する機会がなく、pythonも(ひいてはプログラミング)得意ではないので、何か処理を加えるたびに不明点や問題点が出てきます。簡単な画面を作りたいだけなのに、試行錯誤してしまいます・・・。

今回ご紹介しました、イベントを使って画面の状態を変更するような処理はけっこう使う機会が多いと思うので、もしTkinterをいじる際に参考にしていただけると嬉しいです。

コメント

タイトルとURLをコピーしました