Tkinterのウィンドウにはメニュー(Menu)を設定することができます。メニュー(Menu)はGUIアプリケーションでおなじみの機能で、ここから新しいファイルを開いたり、アプリケーションについての説明を表示したり、アプリケーションを終了する処理を用意しておくことができます。
目次
メニュー(Menu)の生成・配置
メニュー(Menu)はTkinterのウィジェットクラスの1つです。他のウィジェットは主にフレーム内に配置しますが、 Menu はウィンドウ上部に配置するのが一般的です。
まずはアプリケーション内にメニューオブジェクトを生成・配置してみましょう。次のように記述します。
import tkinter as tk # tk.Frameを継承したApplicationクラスを作成 class Application(tk.Frame): def __init__(self, master=None): super().__init__(master) # ウィンドウの設定 self.master.title("ウィンドウのタイトル") # 実行内容 self.pack() # メインフレームを配置 self.create_menu() # 下記で定義しているcreate_menuメソッドを実行 self.create_widget() # 下記で定義しているcreate_widgetメソッドを実行 # create_menuメソッドを定義 def create_menu(self): self.menu_bar = tk.Menu(self) # Menuクラスからmenu_barインスタンスを生成 root.config(menu=self.menu_bar) # メニューバーの配置 self.file_menu = tk.Menu(self.menu_bar) # メニューバーに大項目「ファイル」を生成 self.menu_bar.add_cascade(label="ファイル", menu=self.file_menu) # 大項目「ファイル」を配置 self.file_menu.add_command(label="新規作成") # 大項目「ファイル」に小項目「新規作成」を追加 self.file_menu.add_command(label="開く") # 大項目「ファイル」に小項目「開く」を追加 self.file_menu.add_separator() # セパレーターを追加 self.file_menu.add_command(label="終了") # 大項目「ファイル」に小項目「終了」を追加 # create_widgetメソッドを定義 def create_widget(self): # label1ウィジェット self.label1 = tk.Label(self,text="メニューバーを\n使ってみましょう", padx = 100, pady=75) self.label1.pack() if __name__ == "__main__": root = tk.Tk() app = Application(master=root) app.mainloop()
このようにウィンドウのヘッダー部分にメニューバーが配置され、メニューの大項目をクリックすると小項目が表示されます。まだメニューを押した時の処理は記述していないため、項目をクリックしても何も起きません。
Tkinterのメニューはデフォルトでは小項目の1番上に切り取り線が表示され、切り取り線をクリックするとメニュー部分のみを別ウィンドウとして切り取ることができるようになっています。
メニュー(Menu)を利用した処理
ではメニューをクリックしたときの処理を追加してみましょう。add_commandメソッドで小項目を追加する際にcommand引数に処理をまとめた関数へのポインタを割り当てます。
また、今回は切り取り線を表示しないよう大項目生成時にオプション引数 tearoff の値を0とします。
import tkinter as tk from tkinter.filedialog import askopenfilename # tkinter.filedialogモジュールのaskopenfilenameメソッドをインポート # tk.Frameを継承したApplicationクラスを作成 class Application(tk.Frame): def __init__(self, master=None): super().__init__(master) # ウィンドウの設定 self.master.title("ウィンドウのタイトル") # 実行内容 self.pack() # メインフレームを配置 self.create_menu() # 下記で定義しているcreate_menuメソッドを実行 self.create_widget() # 下記で定義しているcreate_widgetメソッドを実行 # create_menuメソッドを定義 def create_menu(self): # メニューバー用の関数を定義 def NewFile(): print("New File!") def OpenFile(): file_name = askopenfilename() # インポートしたtkinter.filedialogモジュールのaskopenfilenameメソッドを代入 print(file_name) def About(): print("このアプリはhogehogeなアプリです") self.menu_bar = tk.Menu(self) root.config(menu=self.menu_bar) self.file_menu = tk.Menu(self.menu_bar, tearoff=0) # 大項目「ファイル」を生成、切り取り線をオフに self.menu_bar.add_cascade(label="ファイル", menu=self.file_menu) # 大項目「ファイル」を配置 self.file_menu.add_command(label="新規作成", command=NewFile) # 小項目「新規作成」に処理を割り当て self.file_menu.add_command(label="開く", command=OpenFile) # 小項目「開く」に処理を割り当て self.file_menu.add_separator() # セパレーターを追加 self.file_menu.add_command(label="終了", command=root.quit) # 小項目「終了」に処理を割り当て self.help_menu = tk.Menu(self, tearoff=0) # 大項目「ヘルプ」を生成、切り取り線をオフに self.menu_bar.add_cascade(label="ヘルプ", menu=self.help_menu) # 大項目「ヘルプ」を配置 self.help_menu.add_command(label="このアプリケーションの情報を表示します", command=About) # 小項目に処理を割り当て # create_widgetメソッドを定義 def create_widget(self): # label1ウィジェット self.label1 = tk.Label(self,text="メニューバーを\n使ってみましょう", padx = 100, pady=75) self.label1.pack() if __name__ == "__main__": root = tk.Tk() app = Application(master=root) app.mainloop()
メニューバーの中に大項目「ファイル」と「ヘルプ」を用意し、大項目「ファイル」の中には小項目「新規作成」「開く」「終了」を、大項目「ヘルプ」の中には小項目「このアプリケーションの情報を表示します」を用意しました。
複雑な処理は用意していませんが、tkinter本体以外にtkinter.filedialogモジュールのaskopenfilenameメソッドをインポートして、「ファイル」の「開く」からローカルのファイルを選択するとそのファイルのパスをコンソールに表示するようにしています。
メニュー(Menu)で使えるオプション引数
Menuウィジェットを生成する際はウィジェットの共通オプションに加えて次のオプションを使用することができます。
オプション引数
属性 | 説明 | 値 |
---|---|---|
postcommand | このメニューを表示するたびに呼び出される処理を指定できます | 関数名 |
tearoff | 小項目の切り取り線の有無を指定できます。 | 0(オフ) 1(オン) |