Python 3.x tkinter菜单加速器复制回调

Python 3.x tkinter菜单加速器复制回调,python-3.x,tkinter,callback,menu,Python 3.x,Tkinter,Callback,Menu,我看到在MacOS 10.14.6上运行Python 3.7.6和tkinter 8.6时出现了一些奇怪的行为 我已经将“Delete”绑定到一个函数,还添加了一个触发相同函数的菜单命令。我还在菜单命令中添加了一个加速器选项,它只显示文本,实际上并不创建快捷方式(如前所述) 除此之外,在这种情况下,它似乎创建了一个快捷方式:按“删除”键两次触发我的功能:一次用于绑定命令,另一次用于加速器。移除绑定或加速器使其仅触发一次;当然,删除这两个选项会导致键绑定不再激活。当从菜单触发时,它可以正常工作,而

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

我已经将“Delete”绑定到一个函数,还添加了一个触发相同函数的菜单命令。我还在菜单命令中添加了一个加速器选项,它只显示文本,实际上并不创建快捷方式(如前所述)

除此之外,在这种情况下,它似乎创建了一个快捷方式:按“删除”键两次触发我的功能:一次用于绑定命令,另一次用于加速器。移除绑定或加速器使其仅触发一次;当然,删除这两个选项会导致键绑定不再激活。当从菜单触发时,它可以正常工作,而其他键或组合键似乎不会发生这种情况

我不确定我是否错过了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()
这给我留下了两个问题:

  • 这能被其他人复制吗

  • 我如何解决或解决它


  • 您的代码在我运行的
    windows
    系统
    python3.7
    上运行得很好,但是相信MacOS上的tkinter存在一些问题,您可以尝试使用主题为tk
    ttk的菜单按钮
    小部件,看看它是否工作得更好。ttk菜单的外观可能与tk菜单设计略有不同

    这是您使用ttk菜单按钮发布的代码:

    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()
    
    将tkinter作为tk导入
    从tkinter导入ttk
    def bar(事件=无):
    打印(“称为条”)
    def foo(事件=无):
    打印(“称为foo”)
    root=tk.tk()
    #创建ttk菜单按钮
    mb=ttk.Menubutton(root,text=“File”)
    #为此菜单按钮mb创建一系列菜单选项
    mb.menu=tk.menu(mb,tearoff=0)
    mb.menu.add_命令(label=“Something other”,command=bar,accelerator=“Control-s”)
    root.bind(“,bar)
    mb.menu.add_命令(label=“Delete a thing”,command=foo,accelerator=“Delete”)
    root.bind(“,foo)
    配置(menu=mb.menu)
    mb.pack(side='left')
    root.mainloop()
    

    我希望它能起作用

    您的代码在运行
    python3.7
    的我的
    windows
    系统上运行得很好,但是相信MacOS上的tkinter存在一些问题,您可以尝试使用主题tk
    ttk菜单按钮
    小部件,看看它是否工作得更好。ttk菜单的外观可能与tk菜单设计略有不同

    这是您使用ttk菜单按钮发布的代码:

    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()
    
    将tkinter作为tk导入
    从tkinter导入ttk
    def bar(事件=无):
    打印(“称为条”)
    def foo(事件=无):
    打印(“称为foo”)
    root=tk.tk()
    #创建ttk菜单按钮
    mb=ttk.Menubutton(root,text=“File”)
    #为此菜单按钮mb创建一系列菜单选项
    mb.menu=tk.menu(mb,tearoff=0)
    mb.menu.add_命令(label=“Something other”,command=bar,accelerator=“Control-s”)
    root.bind(“,bar)
    mb.menu.add_命令(label=“Delete a thing”,command=foo,accelerator=“Delete”)
    root.bind(“,foo)
    配置(menu=mb.menu)
    mb.pack(side='left')
    root.mainloop()
    

    我希望它能起作用

    我可以在我的OSX系统上复制它。我无法解释。我可以在我的OSX系统上复制它。我无法解释。你的代码确实有效:我想ttk还有一点。不幸的是,您使用的菜单按钮与我用于窗口菜单栏的菜单小部件略有不同。我可能会绑定一个不同的密钥。您的代码确实有效:我想ttk还有一点。不幸的是,您使用的菜单按钮与我用于窗口菜单栏的菜单小部件略有不同。我可能会绑定一个不同的密钥。