【Python/tkinter】Menu(メニュー)

ウィンドウにメニューを追加するには、Menuクラスを用います。

メニューで良く使いそうな機能のサンプルプログラムを作成しました。

(実行画面)

ファイル関連のメニュー

表示メニュー(チェックボタンで作成しています)

選択メニュー(ラジオボタンで作成しています)

(サンプルプログラム)

import tkinter as tk
from tkinter import filedialog

class Application(tk.Frame):
    def __init__(self, master = None):
        super().__init__(master)
        self.pack()

        self.master.title("メニューの作成")       # ウィンドウタイトル
        self.master.geometry("300x150")     # ウィンドウサイズ(幅x高さ)
        
        # ------------------------------------------------
        # メニューの作成

        # メニューバーの作成
        menubar = tk.Menu(self)

        # ファイル
        menu_file = tk.Menu(menubar, tearoff = False)
        menu_file.add_command(label = "ファイルを開く",  command = self.menu_file_open_click,  accelerator="Ctrl+O")
        menu_file.add_command(label = "名前を付けて保存", command = self.menu_file_saveas_click, accelerator="Ctrl+S")
        menu_file.add_separator() # 仕切り線
        menu_file.add_command(label = "終了",            command = self.master.destroy)
        # ショートカットキーの関連付け
        menu_file.bind_all("<Control-o>", self.menu_file_open_click)
        menu_file.bind_all("<Control-s>", self.menu_file_saveas_click)

        # 表示(Checkbutton)
        menu_disp = tk.Menu(menubar, tearoff = False)
        self.disp1_value = tk.BooleanVar()
        self.disp2_value = tk.BooleanVar()
        self.disp3_value = tk.BooleanVar()
        menu_disp.add_checkbutton(label = "表示1", command = self.menu_disp1_click, variable = self.disp1_value)
        menu_disp.add_checkbutton(label = "表示2", command = self.menu_disp2_click, variable = self.disp2_value)
        menu_disp.add_checkbutton(label = "表示3", command = self.menu_disp3_click, variable = self.disp3_value)

        # 選択(Radiobutton)
        self.radio_val = tk.IntVar() # ラジオボタンの値
        menu_select = tk.Menu(menubar, tearoff = False)
        menu_select.add_radiobutton(label = "選択1", command = self.menu_select_click, variable = self.radio_val, value = 1)
        menu_select.add_radiobutton(label = "選択2", command = self.menu_select_click, variable = self.radio_val, value = 2)
        menu_select.add_radiobutton(label = "選択3", command = self.menu_select_click, variable = self.radio_val, value = 3)

        # メニューバーに各メニューを追加
        menubar.add_cascade(label="ファイル", menu = menu_file)
        menubar.add_cascade(label="表示",     menu = menu_disp)
        menubar.add_cascade(label="選択",     menu = menu_select)

        # 親ウィンドウのメニューに、作成したメニューバーを設定
        self.master.config(menu = menubar)

    def menu_file_open_click(self, event=None):
        print("「ファイルを開く」が選択された")
        filename = filedialog.askopenfilename(
            title = "ファイルを開く",
            initialdir = "./" # 自分自身のディレクトリ
            )
        print(filename)

    def menu_file_saveas_click(self, event=None):
        print("「名前を付けて保存」が選択された")

    def menu_disp1_click(self):
        print("「表示1」が選択された")
        print(f"チェック状態は{self.disp1_value.get()}")

    def menu_disp2_click(self):
        print("「表示2」が選択された")
        print(f"チェック状態は{self.disp2_value.get()}")

    def menu_disp3_click(self):
        print("「表示3」が選択された")
        print(f"チェック状態は{self.disp3_value.get()}")

    def menu_select_click(self):
        print(self.radio_val.get(), "番目のラジオボタンが選択されました。")

if __name__ == "__main__":
    root = tk.Tk()
    app = Application(master = root)
    app.mainloop()

ポイント

  • プルダウンで表示されるメニューが1つのMenuクラスオブジェクトとなり、各メニューの項目はadd_command()メソッドで追加します。
  • Menuクラスオブジェクトを親のMenuに追加するときは、add_cascade()メソッドを用います。

Menuクラスオプション

オプション名 説明
activebackground マウスポインタが各メニューの上にあるときの背景色を指定します。
activeborderwidth
選択されたメニューの枠の太さを指定します???
実質的にメニューの行間が広がります。
activeforeground マウスポインタが各メニューの上にあるときの文字色を指定します。
background 通常時の背景色を指定します。(bgと同じ)
bd 枠線の太さを指定します。(指定できない?)
bg backgroundと同じ
bitmap モノクロのBitmapを指定します。
(参考)https://anzeljg.github.io/rin2/book2/2405/docs/tkinter/bitmaps.html
borderwidth bdと同じ
cursor ウィジェット上にマウスポインタがある際のカーソルの種類を指定します。(指定できない?
disabledforeground add_command()メソッドで追加したメニューのstateオプションで無効(DISABLED)に設定している際の文字色を設定します。
fg add_command()メソッドで追加したメニューの文字色を設定します。
foreground fgと同じ
relief ボタンのスタイルを指定します。(指定できない?
【設定値】tk.RAISED, tk.GROOVE, tk.SUNKEN, tk.RIDGE, tk.FLAT
【初期値】tk.FLAT(枠線なし)
selectcolor チェックボックス(チェックのある四角)の背景色を指定します。(指定できない?
takefocus
tearoff 必ずFalse(0)を指定します。
指定しない場合、破線が表示されます。
tearoffcommand
title
type

メソッド

メソッド 説明
add_command() メニュー項目を追加します。
add_radiobutton() ラジオボタンを追加します。(ただし、見た目はチェックボタンと同じ)
add_checkbutton() チェックボタンを追加します。
add_cascade() 親のMenuにMenuクラスオブジェクトを追加します。
add_separator() 仕切り線を追加します。
add( type, options )
delete( startindex [, endindex ]) メニューの項目をstartindex ~(endindex )まで削除します。
entryconfig( index, options ) メニューのindex番号を指定して、オプション設定値を設定、変更します。
index(item) メニューの文字列を指定してindex番号を取得します。
insert_separator ( index ) 指定した番号の位置に仕切り線を挿入します。
invoke ( index ) チェックボックスの場合、チェックの選択/非選択状態が切り替わります。
ラジオボタンの場合、選択されている項目が切り替わります。
type ( index ) 指定した番号のタイプを取得します。
cascade,  checkbutton,  command,  radiobutton,  separator, tearoff のいづれか

(補足)

メニューのindex番号ですが、私の環境では、上のメニューの番号は1から始まり、

ドロップダウンで表示されるメニューは0始まりとなっていました。

念のためindex()メソッドで、メニューの文字列指定でindex番号を取得した方が安全かも?しれません。

コメントを残す

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

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください