tkinter 菜单加速器复制回调



我在MacOS 10.14.6上运行Python 3.7.6和tkinter 8.6时看到了一些奇怪的行为。

我已经将"删除"绑定到一个函数,还添加了一个触发相同函数的菜单命令。我还在菜单命令中添加了一个加速器选项,该选项仅显示文本,实际上并不创建快捷方式(如此处所述(。

除了,在这种情况下,它似乎确实创建了一个快捷方式:按"删除"键触发我的函数两次:一次用于绑定命令,第二次用于加速器。删除绑定或加速器会导致它仅触发一次;当然,删除这两个都会导致密钥绑定不再激活。从菜单触发时它工作正常,而其他键或组合键似乎不会发生这种情况。

我不确定我是否错过了有关 Tkinter 编程的细节,或者我遇到了技术问题。 我确保尝试使用其他键盘,但不确定这是否可能是 Mac 上 Tkinter 的错误。

以下代码始终表现出我的问题:

from tkinter import *
def bar(event=None):
print("Called bar")
def foo(event=None):
print("Called foo")
root = Tk()
menubar = Menu(root)
filemenu = Menu(menubar, tearoff=0)

#works fine
filemenu.add_command(label="Something else", command=bar, accelerator="Control-s")
root.bind("<Control-s>", bar)
#triggers twice when using the "Del" key
filemenu.add_command(label="Delete a thing", command=foo, accelerator="Delete")
root.bind("<Delete>", foo)

menubar.add_cascade(label="File", menu=filemenu)
root.config(menu=menubar)
root.mainloop()

触发每个快捷方式一次会生成以下输出:

Called bar
Called foo
Called foo

因此,这给我留下了两个问题:

  1. 这能被其他人复制吗?

  2. 我该如何解决或解决它?

我也遇到了这个问题,从代码来看,它确实为您的加速器添加了绑定。在我的应用程序中,我通过不绑定OSX上的按键来解决它,但它并不理想。 有一个 Tk 错误:https://core.tcl-lang.org/tk/tktedit?name=ead70921a9665f57d2fbcfb3cdee51391858bc96

您的代码在我的运行Python 3.7windows系统上运行良好,但相信 MacOS 上的 tkinter 存在一些问题,您可以尝试使用主题 tkttk Menubutton小部件,看看它是否更好用。ttk 菜单的外观可能与 tk 菜单设计略有不同。

这是您发布的带有ttk Menubutton的代码:

import tkinter as tk
from tkinter import ttk
def bar(event=None):
print("Called bar")
def foo(event=None):
print("Called foo")
root = tk.Tk()
# create a ttk menubutton
mb = ttk.Menubutton(root, text="File")
# create a cascade of menu options for this menubutton mb
mb.menu = tk.Menu(mb, tearoff=0)
mb.menu.add_command(label="Something else", command=bar, accelerator="Control-s")
root.bind("<Control-s>", bar)
mb.menu.add_command(label="Delete a thing",command=foo, accelerator="Delete")
root.bind("<Delete>", foo)
mb.configure(menu=mb.menu)
mb.pack(side='left')
root.mainloop()

我希望它有效!

最新更新