ウィンドウにメニューを追加するには、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番号を取得した方が安全かも?しれません。