首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何更新OptionMenu的命令

如何更新OptionMenu的命令
EN

Stack Overflow用户
提问于 2016-06-08 13:39:45
回答 2查看 4.4K关注 0票数 2

我正在尝试在OptionMenu实例化之后设置或更新它的命令。

widget.configure(command=foo)语句适用于ButtonCheckButton,但不适用于OptionMenu

以下代码引发此错误:_tkinter.TclError: unknown option "-command"

代码语言:javascript
复制
from Tkinter import Tk, OptionMenu, StringVar

root = Tk()
var = StringVar()

def foo(val):
    print val, var.get()

widget = OptionMenu(root, var, "one", 'two')
widget.configure(command=foo)
widget.pack()
root.mainloop()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-08 15:51:39

我认为您真正要问的是如何将命令关联到Optionmenu,而不是更新命令(没有命令,所以没有什么可更新的)。

如果希望每次从Optionmenu中选择值时调用函数,则可以在相关变量上添加跟踪。无论是通过Optionmenu还是任何其他方式,每当该变量发生变化时,跟踪都会调用该函数。

例如:

代码语言:javascript
复制
...
var = tk.StringVar()
def foo(*args):
    print "the value changed...", var.get()
var.trace("w", foo)
...

当函数被调用时,它将传递三个参数,在本例中您可以安全地忽略这些参数。

有关变量跟踪的更多信息,请参见http://effbot.org/tkinterbook/variable.htm

您还可以考虑切换到ttk组合框。它支持绑定到<<ComboboxSelected>>,它比执行变量跟踪稍微少一些笨重。

票数 4
EN

Stack Overflow用户

发布于 2017-08-13 17:48:14

如果小心,可以更改与OptionMenu widets相关的命令(如@Bryan所述)。下面是一个这样做的例子。

棘手的部分是你必须重新配置所有的菜单项,而不仅仅是其中的一个。这需要一些额外的簿记(以及一些处理开销,但这是不明显的)。

最初,菜单有三个项,每个项都有不同的函数可在选中时调用,其中一个项更改了菜单。如果选择后者,则将菜单更改为只有两个菜单项,这两个菜单项都调用相同的函数。

代码语言:javascript
复制
from tkinter import *

root = Tk()
var = StringVar()
var.set('Select')

def foo(value):
    var.set(value)
    print("foo1" + value)

def foo2(value):
    var.set(value)
    print("foo2 " + value)

def foo3(value):
    var.set(value)
    print("foo3 " + value)

def change_menu(value):
    var.set('Select')
    print('changing optionmenu commands')
    populate_menu(optionmenu, one=foo3, two=foo3)

def populate_menu(optionmenu, **cmds):
    menu = optionmenu['menu']
    menu.delete(0, "end")
    for name, func in cmds.items():
        menu.add_command(label=name, command=
                         lambda name=name, func=func: func(name))

optionmenu = OptionMenu(root, var, ())  # no choices supplied here
optionmenu.pack()
Label(root, textvariable=var).pack()

populate_menu(optionmenu, one=foo, two=foo2, change=change_menu)

root.mainloop()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37704176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档