Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 动态更新ttk.OptionMenu,而不影响其先前的回调/命令_Python_Tkinter_Ttk_Optionmenu_Tkinter Menu - Fatal编程技术网

Python 动态更新ttk.OptionMenu,而不影响其先前的回调/命令

Python 动态更新ttk.OptionMenu,而不影响其先前的回调/命令,python,tkinter,ttk,optionmenu,tkinter-menu,Python,Tkinter,Ttk,Optionmenu,Tkinter Menu,我正在使用不同的ttk.OptionMenu小部件制作一个大型GUI,这些小部件需要根据与用户的交互情况经常更新。每次用户从菜单中选择另一个值时,小部件都会通过命令输入进行函数回调。在我需要更新OptionMenu小部件中的可能值之前,该命令工作正常。使用add_命令更新后,我以前的回调不再工作 有没有办法更新ttk.OptionMenu的可能输入而不影响其原始回调?让我举一个虚拟的例子来说明我的问题。我的原始代码是 from tkinter import * from tkinter impo

我正在使用不同的ttk.OptionMenu小部件制作一个大型GUI,这些小部件需要根据与用户的交互情况经常更新。每次用户从菜单中选择另一个值时,小部件都会通过命令输入进行函数回调。在我需要更新OptionMenu小部件中的可能值之前,该命令工作正常。使用
add_命令
更新后,我以前的回调不再工作

有没有办法更新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))
但是执行此操作时,回调
打印
将不再工作。同样重要的是,在一个选项中单击,它应该成为OptionMenu显示的值(因此StringVar变量被设置为该输入)


我希望很清楚,

tkinter
模块中有一个内部类
\u setit
,它由
选项菜单
内部用于填充值。您可以按如下方式使用此类:

从tkinter导入文件对话框、消息框、ttk、\u设置
...
对于newList中的值:
菜单.添加命令(标签=值,命令=设置(变量,值,打印))

我想这就是我需要的。。。只是一个疑问,如果函数(在本例中是定价)需要一些输入,也可以在这里引入它?我不明白你的意思。我是说打印(),不是定价对不起。。。。在这种情况下,打印不需要任何输入即可工作,但在其他情况下,可能需要输入。它可以通过菜单工作。添加命令(label=value,command=\u setit(变量,值,打印(输入))?然后使用lambda:
command=\u setit(变量,值,lambda:printing(输入))