tkinter菜单加速器和模态对话框

时间:2013-09-03 17:07:52

标签: python menu tkinter modal-dialog accelerator

我想要一个显示模态对话框的菜单。一切都很好,直到我添加加速器。如果我这样做并使用加速器访问对话框,它会挂起。我怀疑,当从“绑定”调用时,在模态对话框中使用的wait_window与mainloop有某种冲突。这是一个例子:

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来访问对话框)。唯一的问题是文件菜单旁边没有显示加速器字符串。根据我发现的网络上的tkinter文档,添加加速器应该只改变菜单的显示方式,而不是别的,所以我真的很困惑。任何想法? (我当然可以通过修改要显示的字符串来模拟加速器,但我不认为这是一个优雅的解决方案。)

1 个答案:

答案 0 :(得分:0)

正如我所注意到的,这是一个特定于Mac的错误。 根据Mac上已知的Tk错误建议的解决方法(请参阅link),将绑定菜单方法的行更改为以下键击:

self.bind_all("<Command-f>", lambda event: self.after(100,self.menu_file))

正在“修复”这个错误。他们还建议在较慢的系统上增加100到150。嗯..