【问题标题】:Tkinter menu bindings and acceleratorsTkinter 菜单绑定和加速器
【发布时间】: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()

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

【问题讨论】:

标签: python macos tkinter


【解决方案1】:

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

IDLE and tkinter with Tcl/Tk on macOS

【讨论】:

  • 在 Python 3.9.5 (Tk 8.6.8) 中,加速器不会触发命令。在 Python 3.10.0 (Tk 8.6.11) 中确实如此。目前尚不清楚这是有意改变还是回归。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多