ここでは、Tkinterでの「Menubar」の使用例をまとめています。
この記事の対象
Menubarとは?
Menubarはアプリに階層構造のメニューを実現したい場合に使用します。
サブメニューなども実現でき、アプリ作成では使用する頻度が多いものです。
基本的な型
tk.Menu(root)
root.config(menu=menubar)
ここでは、rootというMainウィンドウとしています。基本的にはMenuを作成して、config関数でMainウィンドウ内のmenubarとして指定しています。
引数は、トップウィンドウを指定しています。
主なoptionは以下の通りです。
Option | 内容 |
postcommand | 表示時に呼び出される関数 |
tearoff | メニューの切り離し設定。0:無し。1:有り |
tearoffcommand | 切り離し時の関数 |
title | 切り離しメニューのタイトル設定 |
Menu操作関数
主に使用する関数です。
項目 | 内容 |
add_command | サブメニューの追加 |
add_cascade | メインメニューの追加 |
add_radiobutton | 現在選択中のサブメニューにチェックを付与、追加 |
add_checkbutton | 選択したらサブメニューにチェックを付与、追加 |
add_separator | サブメニューの間へ、境界線を挿入 |
index | メニュー名のindex(位置)を取得 |
insert_checbutton | 指定した位置へ選択中のサブメニューにチェックを付与、追加 |
insert_command | 指定した位置へサブメニューを追加 |
insert_cascade | 指定した位置へメインメニューを追加 |
insert_radiobutton | 指定した位置へ選択中のサブメニューにチェックを付与、追加 |
insert_separator | 指定した位置の上へ境界線を挿入 |
Menubarの作成
import tkinter as tk
import tkinter.ttk as ttk
#1---メインウィンドウの作成
root = tk.Tk()
root.title("Test")
root.geometry("600x300")
#2---menubarの作成
menubar = tk.Menu(root)
root.config(menu=menubar)
#3---menubarの設定
set_menu = tk.Menu(menubar, tearoff=0)
menubar.add_cascade(label='設定', menu=set_menu)
root.mainloop()
結果
以下、解説になります。
#1---メインウィンドウの作成
root = tk.Tk()
root.title("Test")
root.geometry("600x300")
1の部分でウィンドウを作成しています。
#2---menubarの作成
menubar = tk.Menu(root)
root.config(menu=menubar)
次に2の部分では、menubarを作成しています。ここで、menubarとしてconfig関数で作成しています。
#3---menubarの設定
set_menu = tk.Menu(menubar, tearoff=0)
menubar.add_cascade(label='設定', menu=set_menu)
3の部分では、作成したmenubarに親メニューを設置しています。親メニューは「add_cascade」で設定します。
add_cascadeで主に使用されるオプションは以下の通りです。
Option | 内容 |
label | メニューのラベル設定 |
bitmap | メニューのラベルをXBM形式の画像に指定 |
state | サブメニューの設定。normal,active,disableから選択 |
image | メインメニューのラベルを画像に指定 |
menu | メインメニューに含むサブメニューの設定を指定 |
Submenuの作成
import tkinter as tk
import tkinter.ttk as ttk
#1---メインウィンドウの作成
root = tk.Tk()
root.title("Test")
root.geometry("600x300")
#2---menubarの作成
menubar = tk.Menu(root)
root.config(menu=menubar)
#3---menubarの設定
set_menu = tk.Menu(menubar, tearoff=0)
menubar.add_cascade(label='設定', menu=set_menu)
#4---Submenuの設定
set_menu.add_command(label="SubMenu")
root.mainloop()
結果
以下、解説になります。
1~3はMenubarの作成で解説しているので、省略します。
#4---Submenuの設定
set_menu.add_command(label="SubMenu")
4の部分でサブメニューを追加しています。サブメニューは「add_command」で追加できます。
add_commandで主に使用されるオプションは以下の通りです。
Option | 内容 |
label | サブメニューのラベル設定 |
accelerator | labelの右側にショートカットキーなどを設定 |
bitmap | サブメニューのラベルをXBM形式の画像に指定 |
state | サブメニューの設定。normal,active,disableから選択 |
image | サブメニューのラベルを画像に指定 |
command | サブメニューを選択したときの実行する関数 |
font | 形式とサイズの指定 |
Radiobuttonのサブメニュー作成
import tkinter as tk
import tkinter.ttk as ttk
#1---メインウィンドウの作成
root = tk.Tk()
root.title("Test")
root.geometry("600x300")
#2---menubarの作成
menubar = tk.Menu(root)
root.config(menu=menubar)
#3---menubarの設定
set_menu = tk.Menu(menubar, tearoff=0)
menubar.add_cascade(label='設定', menu=set_menu)
#4---Submenuの設定
set_menu.add_command(label="SubMenu")
#5---Radiobuttonの追加
setting_menu.add_radiobutton(label="SubRadio")
root.mainloop()
結果
以下、解説になります。
1~4はSubmenuの作成で解説しているので、省略します。
#5---Radiobuttonの追加
setting_menu.add_radiobutton(label="SubRadio")
5の部分でRadiobuttonを追加しています。
add_radiobuttonで主に使用されるオプションは以下の通りです。
Option | 内容 |
label | ラベル設定 |
accelerator | labelの右側にショートカットキーなどを設定 |
bitmap | ラベルをXBM形式の画像に指定 |
state | normal,active,disableから選択 |
image | ラベルを画像に指定 |
command | 選択したとき実行する関数 |
indicatoron | チェック記号の表示有無 |
新しいウィンドウの作成
import tkinter as tk
import tkinter.ttk as ttk
#5---新しいウィンドウ作成関数
def create_dialog():
dlg = tk.Toplevel()
dlg.title("New Dialog")
dlg.geometry("300x200")
#1---メインウィンドウの作成
root = tk.Tk()
root.title("Test")
root.geometry("600x300")
#2---menubarの作成
menubar = tk.Menu(root)
root.config(menu=menubar)
#3---menubarの設定
set_menu = tk.Menu(menubar, tearoff=0)
menubar.add_cascade(label='設定', menu=set_menu)
#4---Submenuの設定
set_menu.add_command(label="SubMenu",command = create_dialog)
root.mainloop()
結果
以下、解説になります。
#5---新しいウィンドウ作成関数
def create_dialog():
dlg = tk.Toplevel()
dlg.title("New Dialog")
dlg.geometry("300x200")
5の部分では、コマンドの処理関数になります。Submenuをクリックしたら「Toplevel」メソッドを用いて新しいウィンドウを作成しています。
1~4の部分については、「Submenuの作成」をご参照下さい。
ショートカットキーの有効化
import tkinter as tk
def file_open():
print("File Open")
def file_save():
print("File Save")
def exit_app():
root.destroy()
root = tk.Tk()
#1---メニューバーの作成
menubar = tk.Menu(root)
#2---サブメニューの作成
file_menu = tk.Menu(menubar, tearoff=0)
file_menu.add_command(label="Open", command=file_open, accelerator="Ctrl+O")
file_menu.add_command(label="Save", command=file_save, accelerator="Ctrl+S")
file_menu.add_separator()
file_menu.add_command(label="Exit", command=exit_app, accelerator="Ctrl+Q")
menubar.add_cascade(label="File", menu=file_menu)
#3---ウィンドウにメニューバーを設定
root.config(menu=menubar)
#4---ショートカットキーのバインディング
root.bind('<Control-o>', lambda event: file_open())
root.bind('<Control-s>', lambda event: file_save())
root.bind('<Control-q>', lambda event: exit_app())
root.mainloop()
結果
ショートカットキーを有効化するには、「accelerator」を設定する必要があります。
以下は解説になります。
#1---メニューバーの作成
menubar = tk.Menu(root)
1の部分ではメニューバーの作成を行っています。
#2---サブメニューの作成
file_menu = tk.Menu(menubar, tearoff=0)
file_menu.add_command(label="Open", command=file_open, accelerator="Ctrl+O")
file_menu.add_command(label="Save", command=file_save, accelerator="Ctrl+S")
file_menu.add_separator()
file_menu.add_command(label="Exit", command=exit_app, accelerator="Ctrl+Q")
menubar.add_cascade(label="File", menu=file_menu)
2の部分ではサブメニューを作成しています。「add_command()」関数の引数に「accelerator」を追加しています。
#3---ウィンドウにメニューバーを設定
root.config(menu=menubar)
3の部分ではメニューバーを設定しています。
#4---ショートカットキーのバインディング
root.bind('<Control-o>', lambda event: file_open())
root.bind('<Control-s>', lambda event: file_save())
root.bind('<Control-q>', lambda event: exit_app())
4の部分では特定のキーバインド(この例ではCtrl+O、Ctrl+S、Ctrl+Q)が押されたときに関数を実行するように設定しています。