今日も見に来てくださって、ありがとうございます。石川さんです。
先日、バーコードを作るプログラムサンプルを作成しました。その時に、バーコードの種類を選べるようにドロップダウンボックスを用意して、選べるようにしようかな、と思いました。ところが調べてみるとドロップダウンの機能は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の方がなじみがありますよね。これで、いくつかの選択肢があっても大丈夫ですね。