Comboboxはテキストボックスとリストボックスを組み合わせたようなウィジェットです。
外観は1行のテキストボックスですが、右端の▼をクリックするとあらかじめ設定された既存の値から選択することもできます。
ユーザーは直接任意の値を入力することもできますし、既存のリストから選択することもできるという汎用性の高いウィジェットとなっています。
今回は、コンボボックスで選択した値をラベルに表示させる方法について、実際にコードを作成しながらまとめました。
【スポンサーリンク】
選択した値をラベルに表示するコンボボックス
コンボボックスの基本
まずは、コンボボックスの外観を示します。

見た目は普通の一行のテキストボックスですが、右端の▼を押してみると、既存の値がリストで表示されます。

例として、「Easy」、「Normal」、「Hard」という3つの文字列を初期値として与えてあります。
一つ選択してみると、コンボボックスに選択した文字列が表示されます。

このようなコンボボックスは様々なアプリで使用されており、省スペースかつ便利なウィジェットです。
動作内容
選択した値をラベルに表示させる機能を持つコンボボックスを作成します。
最初に、完成したアプリの起動時の画面を以下に示します。

ラベルとコンボボックスが並べてあります。
コンボボックスから既存の値を選択すると、ラベルの表記が選択した値に変わります。

コンボボックスの基礎である、選択した値を取得して表示する機能を実装することができました。
コードの説明
準備
まずはモジュールのインポートし、tkinterのトップレベルウィジェットを作成します。
今回インポートするモジュールはtkinterとtkinter.ttkです。
import tkinter from tkinter import ttk #2.Comboboxクラス if __name__ == "__main__": root = tkinter.Tk() #1.変数の設定 #3.ラベル、コンボボックスの生成 root.mainloop()
1.変数の設定
コンボボックスで選択した値を格納する変数として、tkinter.Stringvarオブジェクトを生成します。
#1.変数の設定
var = tkinter.StringVar(master=root)
この変数varを用いて、コンボボックスで選択した値をラベルに反映させます。
具体的には、ラベルのtextvariableオプションに変数varを設定し、かつコンボボックスで選択した値を変数varにセットすることで、コンボボックスで選択した値がラベルの表示値に反映されるようになります。
2.Comboboxクラス
ttk.Comboboxクラスを継承し、選択した値を変数varにセットするコンボボックスクラスを作成していきます。クラス名はTestComboboxとしました。
#2.Comboboxクラス class TestCombobox(ttk.Combobox): def __init__(self, var, master=None): li = ['Easy', 'Normal', 'Hard'] #初期値 super().__init__(master, values=li) #初期値の設定 self.var = var #varをインスタンス変数化 self.bind( #値選択時にshow_selectedを実行 '<<ComboboxSelected>>', self.show_selected ) def show_selected(self, event): self.var.set(self.get()) #選択した値をvarにセット
最初に、コンボボックスのvaluesオプションで初期値を設定しています。
コンボボックスで値を選択すると、ComboboxSelectedイベントが発生するため、それをbindでshow_selectedメソッドを呼び出しています。
show_selectedメソッドでは、選択した値をgetメソッドで取得し、変数varにセットしています。
3.ラベル、コンボボックスの生成
ラベルとコンボボックスを生成していきます。
#3.ラベル、コンボボックスの生成
l = tkinter.Label(textvariable=var)
c = TestCombobox(master=root, var=var)
l.pack()
c.pack()
ラベル生成時にtextvariableオプションで変数varをセットしています。これでvarの値が変化するとラベルの表示値も変化するようになります。
コード全体
import tkinter from tkinter import ttk #2.Comboboxクラス class TestCombobox(ttk.Combobox): def __init__(self, var, master=None): li = ['Easy', 'Normal', 'Hard'] #初期値 super().__init__(master, values=li) #初期値の設定 self.var = var #varをインスタンス変数化 self.bind( #値選択時にshow_selectedを実行 '<<ComboboxSelected>>', self.show_selected ) def show_selected(self, event): self.var.set(self.get()) #選択した値をvarにセット if __name__ == "__main__": root = tkinter.Tk() #1.変数の設定 var = tkinter.StringVar(master=root) #3.ラベル、コンボボックスの生成 l = tkinter.Label(textvariable=var) c = TestCombobox(master=root, var=var) l.pack() c.pack() root.mainloop()