在不影响其之前的 callback/command 的情况下即时更新 ttk.OptionMenu
Update on the fly a ttk.OptionMenu without affecting its previous callback/command
我正在使用不同的 ttk.OptionMenu 小部件制作大型 GUI,这些小部件需要根据与用户的交互经常更新。每次用户从菜单中选择另一个值时,小部件都会通过命令输入进行函数回调。该命令工作正常,直到我需要更新 OptionMenu 小部件中的可能值。使用 add_command
更新后,我之前的回调不再起作用。
有没有什么方法可以在不影响其原始回调的情况下更新 ttk.OptionMenu 的可能输入?让我举一个虚拟的例子来说明我的问题。我的原始代码就像
from tkinter import *
from tkinter import filedialog, messagebox, ttk
def printing(variable,*args):
print('ok')
if variable:
print(variable)
root=Tk()
List=['Madrid', 'Paris', 'Brussels']
variable = StringVar()
optionmenu = ttk.OptionMenu(root,variable,'', *List,
command=printing)
optionmenu.pack()
root.mainloop()
然后用户会动态更新列表,菜单需要动态更新,使用:
newList = ['Madrid', 'Paris', 'Brussels', 'London']
menu = optionmenu["menu"]
menu.delete(0, "end")
for string in newlist:
menu.add_command(label=string,
command=lambda value=string: variable.set(value))
但是执行此操作后,回调printing
将不再起作用。同样重要的是,在一个选项中单击它应该成为 OptionMenu 显示的值(因此 StringVar 变量被设置为该输入)
希望清楚
tkinter
模块中有一个内部 class _setit
,OptionMenu
在内部使用它来填充值。您可以按如下方式使用此 class:
from tkinter import filedialog, messagebox, ttk, _setit
...
for value in newList:
menu.add_command(label=value, command=_setit(variable, value, printing))
我正在使用不同的 ttk.OptionMenu 小部件制作大型 GUI,这些小部件需要根据与用户的交互经常更新。每次用户从菜单中选择另一个值时,小部件都会通过命令输入进行函数回调。该命令工作正常,直到我需要更新 OptionMenu 小部件中的可能值。使用 add_command
更新后,我之前的回调不再起作用。
有没有什么方法可以在不影响其原始回调的情况下更新 ttk.OptionMenu 的可能输入?让我举一个虚拟的例子来说明我的问题。我的原始代码就像
from tkinter import *
from tkinter import filedialog, messagebox, ttk
def printing(variable,*args):
print('ok')
if variable:
print(variable)
root=Tk()
List=['Madrid', 'Paris', 'Brussels']
variable = StringVar()
optionmenu = ttk.OptionMenu(root,variable,'', *List,
command=printing)
optionmenu.pack()
root.mainloop()
然后用户会动态更新列表,菜单需要动态更新,使用:
newList = ['Madrid', 'Paris', 'Brussels', 'London']
menu = optionmenu["menu"]
menu.delete(0, "end")
for string in newlist:
menu.add_command(label=string,
command=lambda value=string: variable.set(value))
但是执行此操作后,回调printing
将不再起作用。同样重要的是,在一个选项中单击它应该成为 OptionMenu 显示的值(因此 StringVar 变量被设置为该输入)
希望清楚
tkinter
模块中有一个内部 class _setit
,OptionMenu
在内部使用它来填充值。您可以按如下方式使用此 class:
from tkinter import filedialog, messagebox, ttk, _setit
...
for value in newList:
menu.add_command(label=value, command=_setit(variable, value, printing))