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

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

【スポンサーリンク】



tkinter Listboxの使い方 Python

tkinterで利用できる、Listboxの使い方を実際にコードを書きながらまとめました。

目次

Listboxの概要

Listboxは、データをリスト化して表示するためのウィジェットで、複数の選択肢からユーザーに選択してもらうときに非常に便利です。

似たようなものに、Comboboxがあります。Comboboxについてはこちらを参照してください。

以下に、tkinterで生成したListboxの外観を示します。

f:id:vigilantPotato:20190312182810j:plain

Listboxの中に、複数の文字列がリスト化して表示されています。

例として、以下のリストの各要素を表示させています。

li = ["aaa", "bbb", "ccc", "ddd", "eee"]

適当に要素を選択してみます。

f:id:vigilantPotato:20190312201739j:plain

選択した項目がハイライトされました。

ここから、クリック時に発生する<<ListboxSelect>>イベントと、indexメソッドやgetメソッドを用いて、ユーザーが選択した要素の情報を取得することが可能です。

次は、Listboxを用いて簡単なアプリを作成し、使い方を確認していきます。

アプリ概要

Listboxを用いて、リストボックスで選択した値をラベルに表示させる機能を持つアプリを作成していきます。

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

f:id:vigilantPotato:20190312182428j:plain

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

リストボックスには初期値が入力されており、先ほどと同様に5つの文字列をリスト化して表示しました。

リスト化された文字列の一つを選択すると、下のラベルにその文字列が表示されます。

f:id:vigilantPotato:20190312182443j:plain

リストボックスの基本である、リスト化表示及びクリックされた要素の情報を取得することができました。

コードの解説

作成したアプリのコードを確認していきます。

まずはモジュールをインポートします。使用するモジュールはtkinterのみです。

import tkinter

次は、リストボックスとラベルを生成するクラス(TestListbox)です。 TestListboxクラスには、ラベルフレームを継承させています。

コードと解説を以下に示します。

class TestListbox(tkinter.LabelFrame):
    def __init__(self, master=None):
        super().__init__(master, text="Listbox")
        #Listbox
        self.listbox = tkinter.Listbox(self) #1
        self.listbox.bind("<<ListboxSelect>>", self.show_item) #2
        li = ["aaa", "bbb", "ccc", "ddd", "eee"] #3
        for item in li:
            self.listbox.insert(tkinter.END, item) #4
        self.listbox.pack()

        #表示用ラベル
        self.label = tkinter.Label(self, text="show_item", bg="lightblue")
        self.label.pack()
    
    def show_item(self, event):
        #リストクリック時に実行するメソッド
        item_index = self.listbox.curselection() #5
        self.label["text"] = self.listbox.get(item_index) #6
  1. Listboxを生成
  2. リストボックスをクリックした際、show_itemメソッドを実行するように設定
  3. リストボックスに表示する文字列のリストを生成
  4. insertでリストボックスに要素を一つずつ追加
  5. curselectionで選択されている要素のインデックス値(ゼロから始まる番号)を取得
  6. getで選択されている要素の中身を取得し、ラベルに表示

最後に、以下のコードで上記のクラスを呼び出して完成です。

if __name__ == "__main__":
    root = tkinter.Tk()
    f = TestListbox(master=root)
    f.pack()
    root.mainloop()

コード全文

import tkinter


class TestListbox(tkinter.LabelFrame):
    def __init__(self, master=None):
        super().__init__(master, text="Listbox")
        #Listbox
        self.listbox = tkinter.Listbox(self, selectmode="extended") #1
        self.listbox.bind("<<ListboxSelect>>", self.show_item) #2
        li = ["aaa", "bbb", "ccc", "ddd", "eee"] #3
        for item in li:
            self.listbox.insert(tkinter.END, item) #4
        self.listbox.pack()

        #表示用ラベル
        self.label = tkinter.Label(self, text="show_item", bg="lightblue")
        self.label.pack()
    
    def show_item(self, event):
        #リストクリック時に実行するメソッド
        item_index = self.listbox.curselection() #5
        self.label["text"] = self.listbox.get(item_index) #6


if __name__ == "__main__":
    root = tkinter.Tk()
    f = TestListbox(master=root)
    f.pack()
    root.mainloop()