今日も見に来てくださって、ありがとうございます。石川さんです。
先日、バーコードを作るプログラムサンプルを作成しました。その時に、バーコードの種類を選べるようにドロップダウンボックスを用意して、選べるようにしようかな、と思いました。ところが調べてみるとドロップダウンの機能はOptionMenuとComboboxの二種類ありました。ぼくの思っていたドロップダウンはComboboxの方でしたが、ちょっと調べたものをまとめておきたいと思います。
出来上がりイメージ
はい、今回のプログラムの出来上がりイメージはこんな感じです。上に、OptionMenu、下にComboboxを配置しました。選択肢は月の和名にしてみました。

ソースコード
ソースコードは以下の通りです。
import tkinter as tk
import tkinter.ttk as ttk
class Application(tk.Tk):
def __init__(self):
super().__init__()
self.title("ドロップダウンサンプル")
months = ["睦月","如月","弥生",
"卯月","皐月","水無月",
"文月","葉月","長月",
"神無月","霜月","師走"]
option_label = tk.Label(self, text="OptionMenu:")
option_label.grid(row=0, column=0, padx=10, pady=10)
self.ov = tk.StringVar()
self.ov.set("弥生")
self.o = tk.OptionMenu(self, self.ov, *months, command=self.optionmenu_selected)
self.o.grid(row=0, column=1, padx=10, pady=10)
combo_label = tk.Label(self, text="Combobox:")
combo_label.grid(row=1, column=0, padx=10, pady=10)
self.c = ttk.Combobox(self, values=months)
self.c.grid(row=1, column=1, padx=10, pady=10)
self.c.current(2)
self.c.bind("<<ComboboxSelected>>", self.combobox_selected)
def optionmenu_selected(self, event):
print(event, self.ov.get())
def combobox_selected(self, event):
print(self.c.get())
if __name__ == '__main__':
application = Application()
application.mainloop()
プログラムの説明
最初のポイントは19行目のOptionMenu()のインスタンスの作成方法ですね。第一引数のselfはよいとして、第二引数は、テキストの変数を指定します。第三引数以降に選択値を書いていきます。今回は、リストで定義しましたので、アスタリスク「*」を付けることでアンパックしています。commandで値が変更されたときの処理を指定することができます。18行目で初期値をセットしています。
次のポイントは25行目のCombobox()のインスタンス作成のところでしょう。27行目のself.c.current(2)で、3個目の要素を初期値にしています。値が変更されたときのイベントを定義するために、28行目のself.c.bind("<<ComboboxSelected>>", self.combobox_selected)の中で疑似イベント<<ComboboxSelected>>を使って処理を指定しています。
現在値の取得は、それぞれ31行目のself.ov.get()と34行目のself.c.get()というふうに記載します。
まとめ
tkinterはもともとUNIXベースで作られていたのだと思います。OptionMenu()の選択肢は、UNIXユーザになじみのあるユーザーインターフェースですが、tkとttkの関係から、こちらの方が先に作られていたようです。Windowsユーザには、Comboboxの方がなじみがありますよね。これで、いくつかの選択肢があっても大丈夫ですね。

