【问题标题】:tkinter menu accelerator duplicating callbackstkinter 菜单加速器复制回调
【发布时间】:2019-12-22 07:47:31
【问题描述】:

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

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

除了,在这种情况下,它确实似乎创建了一个快捷方式:按“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()

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

Called bar
Called foo
Called foo

所以这给我留下了两个问题:

  1. 这可以被其他人复制吗?

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

【问题讨论】:

  • 我可以在我的 OSX 系统上复制它。我无法解释。

标签: python-3.x tkinter callback menu


【解决方案1】:

您的代码在运行Python 3.7 的我的windows 系统上运行良好,但认为MacOS 上的tkinter 存在一些问题,您可以尝试使用主题tk ttk 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()

我希望它有效!

【讨论】:

  • 您的代码确实有效:我想 ttk 的另一点。不幸的是,您使用的 MenuButton 与我用于窗口菜单栏的 Menu 小部件略有不同。我可能最终会绑定一个不同的密钥。
猜你喜欢
  • 2017-08-05
  • 2016-10-28
  • 1970-01-01
  • 2015-11-22
  • 1970-01-01
  • 1970-01-01
  • 2015-05-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多