0

我正在做一个带有不同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 变量被设置为该输入)

我希望很清楚

4

1 回答 1

1

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

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

for value in newList:
    menu.add_command(label=value, command=_setit(variable, value, printing))
于 2020-10-08T17:54:04.463 回答