0

我想要一个显示模式对话框的菜单。一切都很好,直到我添加一个加速器。如果我这样做并使用加速器访问对话框,它会挂起。我怀疑从“绑定”调用时,在模式对话框中使用的 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 来访问对话框)。唯一的问题是“文件”菜单旁边没有显示加速键字符串。根据我在网上找到的 tkinter 文档,添加加速器应该只会改变菜单的显示方式而不是其他任何东西,所以我真的很困惑。有人有什么想法吗?(我当然可以通过修改要显示的字符串来模拟加速器,但我不认为这是一个优雅的解决方案。)

4

1 回答 1

0

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

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

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

于 2013-09-04T02:27:33.507 回答