我正在尝试在OptionMenu实例化之后设置或更新它的命令。
widget.configure(command=foo)语句适用于Button和CheckButton,但不适用于OptionMenu。
以下代码引发此错误:_tkinter.TclError: unknown option "-command"
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()发布于 2016-06-08 15:51:39
我认为您真正要问的是如何将命令关联到Optionmenu,而不是更新命令(没有命令,所以没有什么可更新的)。
如果希望每次从Optionmenu中选择值时调用函数,则可以在相关变量上添加跟踪。无论是通过Optionmenu还是任何其他方式,每当该变量发生变化时,跟踪都会调用该函数。
例如:
...
var = tk.StringVar()
def foo(*args):
print "the value changed...", var.get()
var.trace("w", foo)
...当函数被调用时,它将传递三个参数,在本例中您可以安全地忽略这些参数。
有关变量跟踪的更多信息,请参见http://effbot.org/tkinterbook/variable.htm。
您还可以考虑切换到ttk组合框。它支持绑定到<<ComboboxSelected>>,它比执行变量跟踪稍微少一些笨重。
发布于 2017-08-13 17:48:14
如果小心,可以更改与OptionMenu widets相关的命令(如@Bryan所述)。下面是一个这样做的例子。
棘手的部分是你必须重新配置所有的菜单项,而不仅仅是其中的一个。这需要一些额外的簿记(以及一些处理开销,但这是不明显的)。
最初,菜单有三个项,每个项都有不同的函数可在选中时调用,其中一个项更改了菜单。如果选择后者,则将菜单更改为只有两个菜单项,这两个菜单项都调用相同的函数。
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()https://stackoverflow.com/questions/37704176
复制相似问题