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 在调用时会做两件事:
- 将变量设置为新值
- 使用新值作为参数调用命令
您可以在自己编写的函数中重新创建此行为,但最简单的方法是重用此 class 类似的东西:
ClientMenu.children["menu"].add_command(label = nm
command =_setit(dropdown, nm, dropdowncheck))
像这样更新我的名为 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 在调用时会做两件事:
- 将变量设置为新值
- 使用新值作为参数调用命令
您可以在自己编写的函数中重新创建此行为,但最简单的方法是重用此 class 类似的东西:
ClientMenu.children["menu"].add_command(label = nm
command =_setit(dropdown, nm, dropdowncheck))