Tkinter菜单绑定和加速器

时间:2017-03-14 22:24:59

标签: python macos tkinter

我遇到了一个奇怪的问题,我无法解决正在发生的事情。我正在使用一个使用菜单的Tkinter应用程序。我发现在创建菜单时,所有项目都有加速器,有些项目需要额外的绑定才能使加速器工作(除非已经选择了菜单栏),而有些项目则没有。

当需要额外的绑定时,我遇到双重输入键击的问题。例如,如果我打开一个Toplevel窗口,每次在Entry框中键入一个字符时,我都会在Toplevel和主窗口中获得双重条目。仅当通过键盘命令调用菜单项时才会发生这种情况。

大多数时候这不是问题,虽然我真的想知道底层原因是什么,因为它似乎是错误的,但是当我实现内置操作系统时,这个特别引起了我的注意。 X首选项菜单,使用以下代码:

self.window.createcommand('::tk::mac::ShowPreferences', self._settings)

现在,当我从内置的Preferences键命令Command-,调用settings函数时,它实例化了一个新的Toplevel窗口,这个双重条目就是这样。如果我导航到菜单并用鼠标打开它,就不会发生这种情况。

以下示例为我重新创建了问题。菜单栏不是必需的,但菜单栏和OS X内置首选项都会出现问题。有趣的是,'设置A'它不需要绑定来重现问题,但设置B'确实需要绑定,工作正常。而且,只能使用关键命令。

import Tkinter

def settings(event = None):
    top = Tkinter.Toplevel()
    Tkinter.Entry(top).pack()
    top.mainloop()

root = Tkinter.Tk()

root.createcommand('::tk::mac::ShowPreferences', settings)

menuBar = Tkinter.Menu(root)
fileMenu = Tkinter.Menu(menuBar)
fileMenu.add_command(label = 'Settings A', accelerator = 'Command-Shift-a', command = settings) # Does not require binding
fileMenu.add_command(label = 'Settings B', accelerator = 'Command-b', command = settings)       # Requires binding
menuBar.add_cascade(label = 'File', menu = fileMenu)
root.config(menu = menuBar)
root.bind('<Command-b>', settings)

Tkinter.Entry(root).pack()
root.mainloop()

我怀疑它可能是计算机问题,但我在另一台机器上尝试过,我得到了相同的结果。有没有人知道这里发生了什么以及如何阻止它?

1 个答案:

答案 0 :(得分:0)

如果有人感兴趣,我想我已经深究了这一点。我相信它是由我的tkinter版本引起的。今天我从OS X捆绑版本2.7更新到Python 3,问题仍然存在。然后我将tkinter更新为ActiveTcl 8.5.18.0,问题似乎已经消失。

IDLE and tkinter with Tcl/Tk on macOS