モーダル ダイアログ ボックスを表示するメニューが必要です。アクセラレータを追加するまでは、すべて問題ありません。これを行い、アクセラレータを使用してダイアログにアクセスすると、ハングします。「バインド」から呼び出されたときに、モーダル ダイアログ ボックス内で使用される wait_window が何らかの形でメインループと競合していると思われます。次に例を示します。
import tkinter
from tkinter import simpledialog
class App(tkinter.Tk):
def __init__(self):
tkinter.Tk.__init__(self)
self.bind_all("<Control-f>", lambda event: self.menu_file())
menubar = tkinter.Menu(self)
fileMenu = tkinter.Menu(menubar, tearoff=False)
fileMenu.add_command(label="File", underline=0,
command=self.menu_file, accelerator="Control+f")
# fileMenu.add_command(label="File", underline=0,
# command=self.menu_file)
menubar.add_cascade(label="File",underline=0, menu=fileMenu)
self.config(menu=menubar)
def menu_file(self):
simpledialog.Dialog(self,"Message")
app=App()
app.mainloop()
上記のコードで、アクセラレータを追加する行をコメント アウトし、次の行のコメントを解除すると、ハングアップは発生しません (もちろん、Ctrl+F を使用してダイアログ ボックスにアクセスできます)。唯一の問題は、[ファイル] メニューの横にアクセラレータの文字列が表示されないことです。私が見つけた Web 上の tkinter のドキュメントによると、アクセラレータを追加しても、メニューの表示方法だけが変更され、他には何も変更されないはずなので、本当に困惑しています。誰でもアイデアはありますか?(もちろん、表示される文字列を変更してアクセラレータをエミュレートすることもできますが、これは洗練されたソリューションとは考えていません。)