Python tkinter GUI プログラミング メニューについて

 今日も見に来てくださって、ありがとうございます。石川さんです。プログラミングマニアじゃありませんよ。

 だけど、今回もtkinterのメニューの作り方について、まとめてみました。だから、マニアじゃないんだってば。

出来上がりイメージ

全体感
Fileメニュー
Optionsメニュー

ソースコード

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にメニューを追加していきます。今回は、fileeditoptionをそのメニューの中のメニューとして作成しました。メニューの区切りはadd_separator()を実行することで追加できます。add_cascadeで中にさらに展開するメニューを追加することができます。そして、最後にhelpを追加してみました。

 メニュー追加時のtearoffは、初期値が有効になっています。そのオプションを有効にしておくと、サブメニューを取り外すことができて、独立したウィンドウで好きなところへ配置できるようになっています。オプションを無効にする必要はないのですが、最近はこのようにデザインされているメニューがあまりないので、無効にしておくとよいと思います。

 optionsには、create_checkbuttonでチェック可能なメニューと、add_radiobuttonで選択可能なメニューを追加しました。セットされた値はBooleanVarStringVarを利用して監視しています。これらの値を保持するためのクラスはtkinterで用意されているもので、BooleanVarStringVar以外にも、IntVarDoubleVarがあります。今回は書き込み時(“w”)のコールバックを登録して、書き込み時にprintを実行するようにしました。

 あ、言わずもがなですが、コマンドはcommandオプションで指定できます。

まとめ

 簡単なメニューをつくるのは特に難しくありませんね。アクセラレータやショートカットなんかを追加したい、ということになると環境の違いを考慮する必要も出てきて、ちょっと難しくなるようですね。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


The reCAPTCHA verification period has expired. Please reload the page.