OptionMenu更新后会丢失命令

时间:2018-06-28 09:18:19

标签: python tkinter command optionmenu

当更新我的tkinter OptionMenu称为ClientMenu时,如下所示:

    for i in range(0, len(Clientlist)-1):
    client1d.append(Clientlist[i][0])
ClientMenu.children["menu"].delete(0,len(Clientlist))

for i in range(0, len(Clientlist)):
    nm = Clientlist[i][0]
    client1d.append(nm)
    ClientMenu.children["menu"].add_command(label = nm)

ClientMenu.children["menu"].add_command(label="Add new Client+")

这将删除列表中的所有条目,然后遍历包含菜单中所有选项的一维数组。这样可以正常工作,并将所有选项正确添加到菜单上。

但是最初定义在ClientMenu中的初始命令

ClientMenu = OptionMenu(screen, dropdown, *client1d,"Add new Client+", command = dropdowncheck)

重新创建菜单时,命令dropdowncheck不会运行,但是在删除和重新添加所有内容之前,命令model.predict不会运行。有没有一种方法可以添加回选项以及将“ dropdowncheck”命令添加回OptionMenu

1 个答案:

答案 0 :(得分:0)

您提供给OptionMenu的命令会自动传递到此时创建的菜单中的所有add_command方法。在OptionMenu的__init__中,您可以看到类似

menu.add_command(label=v,
                 command=_setit(variable, v, callback))

由于您的add_command函数未传递任何命令,因此单击这些选项不会触发任何操作。
在上面的代码中,_setit被描述为

class _setit:
    """Internal class. It wraps the command in the widget OptionMenu."""

基本上,此类在被调用时会做两件事:

  1. 将变量设置为新值
  2. 以新值作为参数调用命令

您可以在自己编写的函数中重新创建此行为,但最简单的方法是仅重用此类,例如:

ClientMenu.children["menu"].add_command(label = nm
                                        command =_setit(dropdown, nm, dropdowncheck))