はじめに
TkinterのMenuでは,コマンド付きのメニューボタンを加える際にacceleratorオプションを指定することでいい感じの見た目で表示させることができますが,実際にはこれだけでキーボード・ショートカットを有効にすることができません。メソッドと紐付ける作業が必要となります。そのためのサンプルを示します。
##サンプル
import tkinter as tk
from tkinter import ttk
class Application(tk.Frame):
def __init__(self,master):
super().__init__(master)
self.pack()
self.master.geometry("300x300")
self.master.title("Menubar Sample")
self.create_menubar()
def create_menubar(self):
menubar = tk.Menu(self)
file_menu = tk.Menu(menubar, tearoff=0)
menubar.add_cascade(label="File", menu=file_menu)
file_menu.add_command(label="Open", command=self.onOpen, accelerator="Ctrl+O")
self.master.config(menu=menubar)
self.bind_all("<Control-o>", self.onOpen)
def onOpen(self, event=None):
print("onOpen")
def main():
root = tk.Tk()
app = Application(master=root)
app.mainloop()
if __name__ == "__main__":
main()
self.bind_allでアプリケーションにonOpenを紐付けています。キーボード・ショートカットでonOpenを実行する際はeventが引数として渡されますが,直接メニューボタンをクリックした際には渡されません。そのため,後者に対応すべくeventの初期値をNoneにしています。これが面倒な場合は別途定義しましょう。