今日も見に来てくださって、ありがとうございます。石川さんです。プログラミングマニアじゃありませんよ。
だけど、今回も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
オプションで指定できます。
まとめ
簡単なメニューをつくるのは特に難しくありませんね。アクセラレータやショートカットなんかを追加したい、ということになると環境の違いを考慮する必要も出てきて、ちょっと難しくなるようですね。