【发布时间】:2017-08-05 11:32:04
【问题描述】:
我遇到了一个奇怪的问题,但我无法弄清楚发生了什么。我正在开发一个使用菜单的 Tkinter 应用程序。我发现在创建菜单时,所有项目都有加速器,有些项目需要额外的绑定才能使加速器工作(除非菜单栏已经被选中)而有些则不需要。
当需要额外的绑定时,我遇到了重复输入键击的问题。例如,如果我打开一个Toplevel 窗口,每次在Entry 框中输入一个字符时,我都会在Toplevel 和主窗口中输入一个字符。仅当通过键盘命令调用菜单项时才会发生这种情况。
大多数时候这不是问题,虽然我真的很想知道根本原因是什么,因为它似乎是错误的,但最近当我实现内置的 OS X Preferences 时,这尤其引起了我的注意菜单,使用以下代码:
self.window.createcommand('::tk::mac::ShowPreferences', self._settings)
现在,当我从内置的 Preferences 键命令 Command-, 调用设置函数时,它会实例化一个新的 Toplevel 窗口,就会发生这种双重输入。如果我导航到菜单并用鼠标打开它,它就不会发生。
下面的示例为我重现了这个问题。菜单栏不是绝对必要的,但是菜单栏和 OS X 内置的 Preferences 项都会出现问题。有趣的是,不需要绑定的“设置 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()
我怀疑这可能是计算机问题,但我在另一台机器上尝试过,得到了相同的结果。有谁知道这里发生了什么以及如何防止它?
【问题讨论】:
-
请创建一个Minimal, Complete, and Verifiable example,用尽可能少的行显示您是如何创建绑定的,以及导致重复输入的代码。
-
我已编辑问题以包含代码示例。