初心者でもPythonを使ってみよう

趣味と実益を兼ねたPython学習記

【スポンサーリンク】



【tkinter】 Listboxの使い方 【Python】

Listboxはリスト化されたデータを一覧表示するためのウィジェットです。

今回は、リストボックスから選択した値をラベルに表示させる方法について、実際にコードを作成しながらまとめました。

似たようなウィジェットに、Comboboxがあります。コンボボックスの使い方ついてはこちらを参照してください。

選択した値をラベルに表示するリストボックス

動作内容

選択した値をラベルに表示させる機能を持つリストボックスを作成します。

最初に、完成したアプリの起動時の画面を以下に示します。

f:id:vigilantPotato:20191111231230p:plain

ラベルとリストボックスが並べてあります。

リストボックスに表示されている文字列を選択すると、ラベルの表記が選択した値に変わります。

f:id:vigilantPotato:20191111231315p:plain

リストボックスの基礎である、選択した値を取得して表示する機能を実装することができました。

[↑ 目次へ]

コードの説明

基本的にはコンボボックスと同様の使い方になりますが、細かいところが若干異なるので注意が必要です。

準備

まずはモジュールのインポートし、tkinterのトップレベルウィジェットを作成します。

インポートするモジュールはtkinterのみです。

import tkinter

#2. Listboxクラス

if __name__ == "__main__":
    root = tkinter.Tk()

    #1.変数の設定
    #3.ラベル、リストボックスの生成

    root.mainloop()

1.変数の設定

リストボックスで選択した値を格納する変数として、tkinter.Stringvarオブジェクトを生成します。

#1.変数の設定
var = tkinter.StringVar(master=root)

この変数varを用いて、リストボックスで選択した値をラベルに反映させます。

具体的には、ラベルのtextvariableオプションに変数varを設定し、かつリストボックスで選択した値を変数varにセットすることで、リストボックスで選択した値がラベルの表示値に反映されるようになります。

2.Listboxクラス

Listboxクラスを継承し、選択した値を変数varにセットするクラスを作成していきます。クラス名はTestListboxとしました。

#2. Listboxクラス
class TestListbox(tkinter.Listbox):
    def __init__(self, var, master=None):
        super().__init__(master)
        li = ["Easy", "Normal", "Hard"]     #初期値
        for item in li:
            self.insert(tkinter.END, item)
        self.bind(
            "<<ListboxSelect>>",
            self.show_selected              #値選択時にshow_selectedを実行
            )
        self.var = var                      #varをインスタンス変数化

   
    def show_selected(self, event):
        item_index = self.curselection()    #indexを取得
        self.var.set(self.get(item_index))  #文字列を取得しvarにセット

最初に、リストボックスに表示させる初期値を設定し、for文でひとつづつ挿入ています。

リストボックスで値を選択すると、ListboxSelectedイベントが発生するため、それをbindしてshow_selectedメソッドを呼び出しています。

show_selectedメソッド内では、まず選択したリストのインデックスをcurselectionメソッドで取得しています。その後getメソッドでインデックスから文字列取得し、変数varにセットしています。

コンボボックスと異なり、直接getメソッドで文字列を取得できないことに注意が必要です。

3.ラベル、リストボックスの生成

ラベルとリストボックスを生成していきます。

#3.ラベル、リストボックスの生成
l = tkinter.Label(textvariable=var)
t = TestListbox(master=root, var=var)
l.pack()
t.pack()

ラベル生成時にtextvariableオプションで変数varをセットしています。これでvarの値が変化するとラベルの表示値も変化するようになります。

[↑ 目次へ]

コード全体

import tkinter

#2. Listboxクラス
class TestListbox(tkinter.Listbox):
    def __init__(self, var, master=None):
        super().__init__(master)
        li = ["Easy", "Normal", "Hard"]     #初期値
        for item in li:
            self.insert(tkinter.END, item)
        self.bind(
            "<<ListboxSelect>>",
            self.show_selected              #値選択時にshow_selectedを実行
            )
        self.var = var                      #varをインスタンス変数化

   
    def show_selected(self, event):
        item_index = self.curselection()    #indexを取得
        self.var.set(self.get(item_index))  #文字列を取得しvarにセット


if __name__ == "__main__":
    root = tkinter.Tk()

    #1.変数の設定
    var = tkinter.StringVar(master=root)
    #3.ラベル、リストボックスの生成
    l = tkinter.Label(textvariable=var)
    t = TestListbox(master=root, var=var)
    l.pack()
    t.pack()
    root.mainloop()

[↑ 目次へ]