naritoブログ

このブログはDjangoとBootstrap4で作成されました
ソースコード

Tkinterで、Menuを使う

プログラミング関連 Python Tkinter 約62日前
2017年10月10日16:55
メニューの作成方法についてです。今回はtk.Menuを継承したクラスを定義してみます。
最もシンプルな方法だと、以下のようになります。
import tkinter as tk


class Menu(tk.Menu):
    def __init__(self, master=None):
        super().__init__(master)
        self.create_file_menu()

    def create_file_menu(self):
        """Fileメニューの作成"""
        menu_file = tk.Menu(self)
        menu_file.add_command(label='New')
        self.add_cascade(menu=menu_file, label='File')

if __name__ == '__main__':
    root = tk.Tk()
    root.title('メニューテスト')
    root['menu'] = Menu()  # ここでメニューをセット
    root.mainloop()



これは以下のように表示されます。




root['menu']=Menu()のようにしてtk.Menuを継承したクラスを指定します。
if __name__ == '__main__':
    root = tk.Tk()
    root.title('メニューテスト')
    root['menu'] = Menu()  # ここでメニューをセット
    root.mainloop()



Fileメニューに、項目をもう少し足してみましょう。
    def create_file_menu(self):
        """Fileメニューの作成"""
        menu_file = tk.Menu(self)
        menu_file.add_command(label='New')
        menu_file.add_command(label='Open')  # 足した
        menu_file.add_command(label='Save')  # 足した
        menu_file.add_command(label='Delete')  # 足した
        self.add_cascade(menu=menu_file, label='File')



ちゃんとたされています。



メニューの横にショートカットキー名が表示されていることがよくあります。
それをしたいならば、以下のようにしましょう。accelerator='Ctrl+N' の部分です。
    def create_file_menu(self):
        """Fileメニューの作成"""
        menu_file = tk.Menu(self)
        menu_file.add_command(label='New', accelerator='Ctrl+N')
        menu_file.add_command(label='Open', accelerator='Ctrl+O')
        menu_file.add_command(label='Save', accelerator='Ctrl+S')
        menu_file.add_command(label='Delete', accelerator='Ctrl+D')
        self.add_cascade(menu=menu_file, label='File')



OKですね。



更に、メニューを押すと何らかの処理をしたい場合もあります。これはcommand=...のように指定します。
    def create_file_menu(self):
        """Fileメニューの作成"""
        menu_file = tk.Menu(self)
        menu_file.add_command(label='New', accelerator='Ctrl+N', command=lambda: print('New'))
        menu_file.add_command(label='Open', accelerator='Ctrl+O', command=lambda: print('Open'))
        menu_file.add_command(label='Save', accelerator='Ctrl+S', command=lambda: print('Save'))
        menu_file.add_command(label='Delete', accelerator='Ctrl+D', command=lambda: print('Delete'))
        self.add_cascade(menu=menu_file, label='File')


関数オブジェクトを渡せばいいので、ラムダ関数を無理に使わなくても大丈夫です。bindと違い、event引数もいりません。
menu_file.add_command(label='New', accelerator='Ctrl+N', command=your_function)



File以外のメニューが欲しくなれば、以下のように足していきます。
class Menu(tk.Menu):
    def __init__(self, master=None):
        super().__init__(master)
        self.create_file_menu()
        self.create_edit_menu()

    def create_file_menu(self):
        """Fileメニューの作成"""
        menu_file = tk.Menu(self)
        menu_file.add_command(label='New', accelerator='Ctrl+N', command=lambda: print('New'))
        menu_file.add_command(label='Open', accelerator='Ctrl+O', command=lambda: print('Open'))
        menu_file.add_command(label='Save', accelerator='Ctrl+S', command=lambda: print('Save'))
        menu_file.add_command(label='Delete', accelerator='Ctrl+D', command=lambda: print('Delete'))
        self.add_cascade(menu=menu_file, label='File')

    def create_edit_menu(self):
        """Editメニューの作成"""
        menu_edit = tk.Menu(self)
        menu_edit.add_command(label='Search', accelerator='Ctrl+F', command=lambda: print('Search'))
        menu_edit.add_command(label='Replace', accelerator='Ctrl+H', command=lambda: print('Replace'))
        self.add_cascade(menu=menu_edit, label='Edit')


ちゃんと追加されました。