今日も見に来てくださって、ありがとうございます。石川さんです。プログラミングマニアじゃありませんよ。
だけど、今回もtkinterのメニューの作り方について、まとめてみました。だから、マニアじゃないんだってば。
出来上がりイメージ



ソースコード
import tkinter as tk
import tkinter.messagebox as mb
class App(tk.Tk):
def __init__(self):
super().__init__()
self.title("Menu sample")
self.geometry("400x50")
menu = tk.Menu(self)
file = tk.Menu(menu, tearoff=0)
edit = tk.Menu(menu, tearoff=0)
option = tk.Menu(menu, tearoff=0)
file.add_command(label="New")
file.add_command(label="Open")
file.add_separator()
file.add_command(label="Save")
file.add_command(label="Save all")
file.add_command(label="Save as...")
file.add_separator()
file.add_command(label="Quit", command=self.destroy)
edit.add_command(label="Undo")
edit.add_command(label="Redo")
edit.add_command(label="Cut")
edit.add_command(label="Copy")
edit.add_command(label="Paste")
edit.add_command(label="Select All")
self.check = tk.BooleanVar(name="check")
self.check.trace("w", self.checked)
option.add_checkbutton(label="Check", onvalue=True, offvalue=False, variable=self.check)
option.add_separator()
self.radio = tk.StringVar(name="radio",value="A")
self.radio.trace("w", self.selected)
option.add_radiobutton(label="A", value="A", variable=self.radio)
option.add_radiobutton(label="B", value="B", variable=self.radio)
option.add_radiobutton(label="C", value="C", variable=self.radio)
menu.add_cascade(label="File", menu=file)
menu.add_cascade(label="Edit", menu=edit)
menu.add_cascade(label="Options", menu=option)
menu.add_command(label="Help", command=lambda:mb.showinfo("Help","Help me!"))
self.config(menu=menu)
def checked(self, *args):
print(self.check.get(), *args)
def selected(self, *args):
print(self.radio.get(), *args)
if __name__ == "__main__":
app = App()
app.mainloop()
解説
ソースコードを見ればそのままなので、特に解説は必要ないような気がしてきました。が、気を取り直して、menuの変数にトップレベルのメニューを追加しました。以降は、このmenuにメニューを追加していきます。今回は、file、edit、optionをそのメニューの中のメニューとして作成しました。メニューの区切りはadd_separator()を実行することで追加できます。add_cascadeで中にさらに展開するメニューを追加することができます。そして、最後にhelpを追加してみました。
メニュー追加時のtearoffは、初期値が有効になっています。そのオプションを有効にしておくと、サブメニューを取り外すことができて、独立したウィンドウで好きなところへ配置できるようになっています。オプションを無効にする必要はないのですが、最近はこのようにデザインされているメニューがあまりないので、無効にしておくとよいと思います。
optionsには、create_checkbuttonでチェック可能なメニューと、add_radiobuttonで選択可能なメニューを追加しました。セットされた値はBooleanVarとStringVarを利用して監視しています。これらの値を保持するためのクラスはtkinterで用意されているもので、BooleanVarとStringVar以外にも、IntVarとDoubleVarがあります。今回は書き込み時(“w”)のコールバックを登録して、書き込み時にprintを実行するようにしました。
あ、言わずもがなですが、コマンドはcommandオプションで指定できます。
まとめ
簡単なメニューをつくるのは特に難しくありませんね。アクセラレータやショートカットなんかを追加したい、ということになると環境の違いを考慮する必要も出てきて、ちょっと難しくなるようですね。

