tkinter

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

スポンサーリンク

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

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

(実行画面)

ファイル関連のメニュー

Python tkinter Menu

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

Python tkinter Menu

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

Python tkinter 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("", self.menu_file_open_click)
        menu_file.bind_all("", self.menu_file_saveas_click)

        # 表示(Checkbutton)
        menu_disp = tk.Menu(menubar, tearoff = False)
        menu_disp.add_checkbutton(label = "表示1")
        menu_disp.add_checkbutton(label = "表示2")
        menu_disp.add_checkbutton(label = "表示3")

        # 選択(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」が選択された")

    def menu_disp2_click(self):
        print("「表示2」が選択された")

    def menu_disp3_click(self):
        print("「表示3」が選択された")

    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枠線の太さを指定します。(指定できない?)
bgbackgroundと同じ
bitmapモノクロのBitmapを指定します。
(参考)https://anzeljg.github.io/rin2/book2/2405/docs/tkinter/bitmaps.html
borderwidthbdと同じ
cursorウィジェット上にマウスポインタがある際のカーソルの種類を指定します。(指定できない?
disabledforegroundadd_command()メソッドで追加したメニューのstateオプションで無効(DISABLED)に設定している際の文字色を設定します。
fgadd_command()メソッドで追加したメニューの文字色を設定します。
foregroundfgと同じ
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から始まり、

Python tkinter Menu

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

Python tkinter Menu

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

コメント

タイトルとURLをコピーしました