こんにちは!ゆーや(@yuyamanm118712)です。
こちらのページでは完全独学でWebプログラマとなった私が
デスクトップアプリには必須!!Tkinterの
Menuウィジェットの使い方、オプションを実際に動作するサンプルコードを用いて、初心者でもわかりやすく解説します!


Tkinterの基本的な使い方は以下の記事を見てね!
この記事を読むと
- TkinterでMenuが作成できる!
- TkinterでMenuの基本的な使い方について理解できる!
- TkinterでMenuのオプションについて理解できる!
Menuウィジェットとは
Menuウィジェットはアプリケーションのメニューバーを作成するのに非常に便利です!

ここから実際に動くコードで
Menuがどういうものか理解していこう!
Menuの基本
Menu作成までのサンプルコード
import tkinter as tk
root = tk.Tk()
root.title("Menu-完全独学Python")
root.geometry("400x300")
# メニューバーの作成
menubar = tk.Menu(root)
root.config(menu=menubar)
# ファイルメニューの作成
filemenu = tk.Menu(menubar, tearoff=0)
filemenu.add_command(label="New")
filemenu.add_command(label="Open")
filemenu.add_command(label="Save")
filemenu.add_separator()
filemenu.add_command(label="Exit", command=root.quit)
menubar.add_cascade(label="File", menu=filemenu)
# 編集メニューの作成
editmenu = tk.Menu(menubar, tearoff=0)
editmenu.add_command(label="Cut")
editmenu.add_command(label="Copy")
editmenu.add_command(label="Paste")
menubar.add_cascade(label="Edit", menu=editmenu)
root.mainloop()


これはよく見るメニューバーだね!
最初にMenu(root)でメニューバーを作り、
root.config(menu=menubar)で作ったメニューを画像のように表示できる!
メニューバーに乗せたいMenuウィジェットは
Menu(menubar, tearoff=0)と書き方が違うことに注意!
ここから詳しく説明していくよ!
Menuのオプション
メニューにコマンドを追加(add_command)
import tkinter as tk
root = tk.Tk()
root.title("Menu-完全独学Python")
root.geometry("400x300")
# メニューバーの作成
menubar = tk.Menu(root)
root.config(menu=menubar)
# ファイルメニューの作成
filemenu = tk.Menu(menubar, tearoff=0)
filemenu.add_command(label="New")
filemenu.add_command(label="Open")
filemenu.add_command(label="Save")
filemenu.add_command(label="追加")
filemenu.add_separator()
filemenu.add_command(label="Exit", command=root.quit)
menubar.add_cascade(label="File", menu=filemenu)
# 編集メニューの作成
editmenu = tk.Menu(menubar, tearoff=0)
editmenu.add_command(label="Cut")
editmenu.add_command(label="Copy")
editmenu.add_command(label="Paste")
menubar.add_cascade(label="Edit", menu=editmenu)
root.mainloop()


add_commandでlabelを設定すれば好きな項目を追加できるよ!
もちろん日本語でも大丈夫!
メニューに区切り線を追加(add_separator)
import tkinter as tk
root = tk.Tk()
root.title("Menu-完全独学Python")
root.geometry("400x300")
# メニューバーの作成
menubar = tk.Menu(root)
root.config(menu=menubar)
# ファイルメニューの作成
filemenu = tk.Menu(menubar, tearoff=0)
filemenu.add_command(label="New")
filemenu.add_command(label="Open")
filemenu.add_command(label="Save")
filemenu.add_separator()
filemenu.add_separator()
filemenu.add_separator()
filemenu.add_command(label="Exit", command=root.quit)
menubar.add_cascade(label="File", menu=filemenu)
# 編集メニューの作成
editmenu = tk.Menu(menubar, tearoff=0)
editmenu.add_command(label="Cut")
editmenu.add_command(label="Copy")
editmenu.add_command(label="Paste")
menubar.add_cascade(label="Edit", menu=editmenu)
root.mainloop()


add_separatorで境界線を追加できるよ!
項目を分類して配置できるね!
メニューを他のメニューに追加(add_cascade)
import tkinter as tk
root = tk.Tk()
root.title("Menu-完全独学Python")
root.geometry("400x300")
# メニューバーの作成
menubar = tk.Menu(root)
root.config(menu=menubar)
# ファイルメニューの作成
filemenu = tk.Menu(menubar, tearoff=0)
filemenu.add_command(label="New")
filemenu.add_command(label="Open")
filemenu.add_command(label="Save")
filemenu.add_separator()
filemenu.add_command(label="Exit", command=root.quit)
#menubar.add_cascade(label="File", menu=filemenu)
# 編集メニューの作成
editmenu = tk.Menu(menubar, tearoff=0)
editmenu.add_command(label="Cut")
editmenu.add_command(label="Copy")
editmenu.add_command(label="Paste")
menubar.add_cascade(label="Edit", menu=editmenu)
root.mainloop()


add_cascadeをコメントアウトすると、メニューバーに表示されないのがわかる!
作ったMenuウィジェットをメニューバーに表示する時は、忘れずに!
メニューをウィンドウから切り離して独立したウィンドウとして表示(tearoff)
import tkinter as tk
root = tk.Tk()
root.title("Menu-完全独学Python")
root.geometry("400x300")
# メニューバーの作成
menubar = tk.Menu(root)
root.config(menu=menubar)
# ファイルメニューの作成
filemenu = tk.Menu(menubar, tearoff=1)
filemenu.add_command(label="New")
filemenu.add_command(label="Open")
filemenu.add_command(label="Save")
filemenu.add_separator()
filemenu.add_command(label="Exit", command=root.quit)
menubar.add_cascade(label="File", menu=filemenu)
# 編集メニューの作成
editmenu = tk.Menu(menubar, tearoff=0)
editmenu.add_command(label="Cut")
editmenu.add_command(label="Copy")
editmenu.add_command(label="Paste")
menubar.add_cascade(label="Edit", menu=editmenu)
root.mainloop()
切り取り線表示

切り取り線押下


あまり使うことはないかもしれないけど、tearoff=1とすると、
切り取り線が出てくるよ!
クリックすると切り取れてウィンドウから切り離すことができる!
応用
イベント付メニューバー
import tkinter as tk
root = tk.Tk()
root.title("Menu-完全独学Python")
root.geometry("400x300")
def new_file():
print("New File Created")
def open_file():
print("File Opened")
def save_file():
print("File Saved")
def cut_text():
print("Cut Text")
def copy_text():
print("Copy Text")
def paste_text():
print("Paste Text")
def select_radio():
print(f"Selected Option: {radio_var.get()}")
def toggle_check():
print(f"Check Status: {check_var.get()}")
# メニューバーの作成
menubar = tk.Menu(root)
root.config(menu=menubar)
# ファイルメニューの作成
filemenu = tk.Menu(menubar, tearoff=0)
filemenu.add_command(label="New", command=new_file)
filemenu.add_command(label="Open", command=open_file)
filemenu.add_command(label="Save", command=save_file)
filemenu.add_separator()
filemenu.add_command(label="Exit", command=root.quit)
menubar.add_cascade(label="File", menu=filemenu)
# 編集メニューの作成
editmenu = tk.Menu(menubar, tearoff=0)
editmenu.add_command(label="Cut", command=cut_text)
editmenu.add_command(label="Copy", command=copy_text)
editmenu.add_command(label="Paste", command=paste_text)
menubar.add_cascade(label="Edit", menu=editmenu)
# ビューメニューの作成
viewmenu = tk.Menu(menubar, tearoff=0)
check_var = tk.BooleanVar()
viewmenu.add_checkbutton(label="Show Line Numbers", variable=check_var, command=toggle_check)
menubar.add_cascade(label="View", menu=viewmenu)
# オプションメニューの作成
optionmenu = tk.Menu(menubar, tearoff=0)
radio_var = tk.StringVar()
optionmenu.add_radiobutton(label="Option 1", variable=radio_var, value="1", command=select_radio)
optionmenu.add_radiobutton(label="Option 2", variable=radio_var, value="2", command=select_radio)
optionmenu.add_radiobutton(label="Option 3", variable=radio_var, value="3", command=select_radio)
menubar.add_cascade(label="Options", menu=optionmenu)
# ヘルプメニューの作成
helpmenu = tk.Menu(menubar, tearoff=0)
helpmenu.add_command(label="About", command=lambda: print("About This App"))
menubar.add_cascade(label="Help", menu=helpmenu)
root.mainloop()


各項目にイベントを紐づける際のサンプルコードだよ!
試しに項目を押してみると、コンソールに値が表示されるはず!
試してみよう!
まとめ
本記事では、Menuを使って、Tkinterで画面にメニューバーを表示するボタンを表示する方法を紹介しました!
ポイントは以下の7つです!
① Tkinterで画面にメニューバーを表示するには「Menu」を使う
② 「add_command」オプションは、メニューにコマンドを追加!
③ 「add_separator」オプションは、メニューに区切り線を追加!
④ 「add_cascade」オプションは、メニューを他のメニューに追加!
⑤ 「tearoff」オプションは、メニューをウィンドウから切り離して独立したウィンドウとして表示!

まとめの内容を見て、もう頭に浮かべば完璧!
今日もお疲れ様です!
コメント