OptionMenu 在更新时丢失命令

OptionMenu loses command when updated

像这样更新我的名为 ClientMenu 的 tkinter OptionMenu 时:

    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 在重新创建菜单时不会 运行 但是在删除并重新添加所有内容之前它会执行。有没有办法添加回选项以及将 "dropdowncheck" 命令添加回 OptionMenu

您给 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."""

基本上,这个 class 在调用时会做两件事:

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

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

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