【问题标题】:How to use <<MenuSelect>> to bind to a tkinter menu item selection如何使用 <<MenuSelect>> 绑定到 tkinter 菜单项选择
【发布时间】:2015-10-14 18:04:11
【问题描述】:

我一直在尝试将回调绑定到菜单项选择,而不是使用 add_command 方法的 command= 功能。

但是,似乎无论我尝试什么,它只会在选择菜单项(“菜单 1”和“菜单 2”)时给我一个正确的索引,而不是按钮的索引菜单。当按下按钮时将只打印无。

这是我当前的测试代码,但我一直在尝试很多不同的东西。

import tkinter as tk

def menucallback(event):
    print(root.call(event.widget, "index", "active"))

root = tk.Tk()

# create menu
menubar = tk.Menu(root)
menu1 = tk.Menu(menubar, tearoff=0)
menu1.add_command(label="Button 1")
menu1.add_command(label="Button 2")
menubar.add_cascade(label="Menu 1", menu=menu1)

menu2 = tk.Menu(menubar, tearoff=0)
menu2.add_command(label="Button 6")
menu2.add_command(label="Button 7")

menubar.add_cascade(label="Menu 2", menu=menu2)

tk.Tk.config(root, menu=menubar)

# bind to function
menubar.bind("<<MenuSelect>>", menucallback)

root.mainloop()

以防万一,我使用的是 Windows 7 和 Python 3.4

【问题讨论】:

    标签: python python-3.x tkinter python-3.4


    【解决方案1】:

    如果您希望事件在下拉菜单上触发,则需要为每个菜单添加相同的绑定。

    选择菜单项时没有出现的原因可能是因为在调用回调之前菜单的状态发生了变化(即:单击后没有活动项)。

    【讨论】:

    • 谢谢,这有点帮助。现在,当我将鼠标悬停在项目上时,它将打印正确的索引,但当我按下它时仍然没有。你有什么想法?我想我以某种错误的方式解决了这个问题。
    • @anderswb:就像我说的,当你点击时,按钮不再处于活动状态。 &lt;&lt;MenuSelect&gt;&gt; 旨在在项目处于活动状态时显示上下文相关帮助,它并非旨在用于任何其他目的。如果您需要在用户单击按钮时发生某些事情,只需使用 command 属性即可。
    • 啊,我明白了。我正在搞乱创建 MVC 模式,并试图避免将视图写回控制器。因此绑定。非常感谢您的意见!
    • @BryanOakley 他可以存储 MenuSelect 返回的值并通过 wait_variable 运行函数。但你是对的,当已经有运行命令的选项时,就不需要它了。
    【解决方案2】:

    对你来说可能有点晚了,但我认为我需要它。 事实上我不需要,但也许其他人需要它:

    import tkinter as tk
    
    def menucallback(event):
        check = root.call(event.widget, "index","active")
        if check != "none":
            menu_index.set(check)
    def foo():
        display.configure(text=menu_index.get())
        index = menu_index.get()
        if index == 0:
            display.configure(bg='blue')
        if index == 1:
            display.configure(bg='red')
        display.wait_variable(menu_index)
        foo()
        
        
    
    root = tk.Tk()
    display = tk.Label(root, text='default')
    display.pack(fill='x')
    
    menu_index = tk.IntVar()
    
    menubar =tk.Menu(root)
    menu1 = tk.Menu(menubar, tearoff=0)
    menu1.add_command(label="Button1")
    menu1.add_command(label="Button2")
    menubar.add_cascade(label='Menu1', menu=menu1)
    
    menu1.bind('<<MenuSelect>>', menucallback)
    tk.Tk.config(root, menu=menubar)
    
    foo()
    root.mainloop()
    

    终于找到a usefull place for that code。它可用于在菜单上创建滚动按钮注意 此代码似乎是 Windows only 解决方案。

    【讨论】:

    • 这段代码在 OSX 上似乎没有任何用处。
    • @Bryan 此代码仅在单击后执行。正如您所说,这是一种不必要的调用命令的方式。单击命令后,它应该会改变颜色。
    • 点击对我没有任何作用。没有颜色变化,没有错误。
    • 这很奇怪,我今天刚刚检查了这段代码,它适用于 MS、Windows 10。感谢您指出这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-14
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 2017-09-28
    相关资源
    最近更新 更多