快速更新ttk.OptionMenu,而不会影响其先前的回调/命令

问题描述

我正在使用不同的 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','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变量将稳定在该输入上),这很重要

我希望这很清楚

解决方法

_setit模块中有一个内部类tkinterOptionMenu在内部使用该内部类来填充值。您可以按如下方式使用此类:

from tkinter import filedialog,messagebox,ttk,_setit
...

for value in newList:
    menu.add_command(label=value,command=_setit(variable,value,printing))