田舎社会人のいろいろ学習記

Python、英語、その他いろいろ

【tkinter.ttk】Comboboxの使い方【Python】

ComboboxはTextboxとListboxを組み合わせたようなウィジェットである。外観は1行のテキストボックスだが、右端の▼をクリックすることであらかじめ設定したリストから値を選択することができる。

f:id:vigilantPotato:20190518120147p:plain

Comboboxの概要、初期値の設定方法、選択した値の取得方法をまとめた。

【スポンサーリンク】


Comboboxの概要

tkinter.ttkのインポート

Comboboxはtkinter内のttkモジュールをインポートすることで利用可能となる。tkinterのインポートだけでは使用できないことに注意が必要。以下の通り、tkinterとttkの両方をインポートしておく。

import tkinter
from tkinter import ttk

概要

Comboboxの外観を以下に示す。

f:id:vigilantPotato:20190518120135p:plain

見た目は普通の一行のテキストボックスだが、右端の▼をクリックするとあらかじめ設定された値がリストで表示される。以下の例では、「Easy」、「Normal」、「Hard」という3つの文字列を初期値として与えてある。

f:id:vigilantPotato:20190518120147p:plain

選択してみると、Comboboxに選択した文字列が表示される。

f:id:vigilantPotato:20190518120226p:plain

Comboboxは様々なアプリで使用されており、省スペースかつ便利なウィジェットである。

[↑ 目次へ]


初期値を設定する方法

Comboboxのvaluesオプションを設定することで初期値を設定することができる。以下に例を示す。

import tkinter
from tkinter import ttk

root = tkinter.Tk()     #トップレベルウィジェット

item_list = ['Easy', 'Normal', 'Hard']  #初期値
test_combobox = ttk.Combobox(
    master=root,
    values=item_list,                   #設定
    )

test_combobox.pack()    #Comboboxを表示
root.mainloop()

[↑ 目次へ]


選択した値の取得方法

選択した値を取得するには、ComboboxSelectedイベントを利用する必要がある。これは、Combobox内の値を選択したときに発生するイベントで、bindメソッドを用いて特定の関数に紐づけることができる。また、選択した値はgetメソッドで取得することができる。
以下の例を実行すると、選択した値を出力することができる。

import tkinter
from tkinter import ttk

#選択時に実行される関数
def show_selected(event):       #eventを引数に
    print(test_combobox.get())  #選択した値を表示


root = tkinter.Tk()

item_list = ['Easy', 'Normal', 'Hard']
test_combobox = ttk.Combobox(
    master=root,
    values=item_list,
    )

#値選択時に発生するイベントと関数を紐づけ
test_combobox.bind(
    '<<ComboboxSelected>>',     #選択時に発生するイベント
    show_selected,              #呼び出す関数
)

test_combobox.pack()

root.mainloop()

[↑ 目次へ]


【スポンサーリンク】

選択した値をLabelに表示

選択した値をprint出力するのではなく、Label等に表示させたい場合は、tkinter.StringVar等のVariableクラスを使用すると良い。
また、Comboboxクラスを継承したクラスを作成し、その中でイベントと実行する関数の紐づけを行う。やっていることは前回と同じだが、中身が非常にわかりやすくなり、使い勝手が向上する。

f:id:vigilantPotato:20190518120408p:plain

import tkinter
from tkinter import ttk


#Comboboxクラスを継承したTestCombobox2クラス
class TestCombobox2(ttk.Combobox):
    def __init__(self, li, var, master=None):   #var(StringVar)を追加
        super().__init__(master, values=li)
        
        self.var = var  #var(StringVar)をインスタンス変数化
        
        self.bind(
            '<<ComboboxSelected>>',
            self.show_selected,
            )
        
    def show_selected(self, event):
        self.var.set(self.get())    #選択した値をvar(StringVar)にセット
        

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

    #StringVarとラベルの生成
    var = tkinter.StringVar(root)
    l = tkinter.Label(
        textvariable=var,   #textvariableオプションにStringVarをセット
        master=root,
        )    
    l.pack()

    li = ['Easy', 'Normal', 'Hard']
    c = TestCombobox2(li, var, master=root)   #TestCombobox2を生成
    c.pack()

    root.mainloop()

StringVarをLabelのtextvariableオプションにセットしておき、Combobox選択時にStringVarに値をセットすることで即座に選択した値がLabelに反映される。

[↑ 目次へ]


【スポンサーリンク】