ttk.OptionMenu() 在所有菜单上显示复选标记
ttk.OptionMenu() displaying check mark on all menus
在此示例中,如果用户在任何下拉菜单中选择任何选项,然后单击另一个下拉菜单,则先前选择的项目旁边会显示一个复选标记。即使该选项是在不同的菜单中选择的。
from Tkinter import *
from ttk import *
choices = ['1st Choice', '2nd Choice', '3rd Choice', '4th Choice']
root = Tk()
for each in range(10):
OptionMenu(root, StringVar(), choices[0], *choices).pack()
root.mainloop()
这发生在 Python 2.7 和 3.5 上。
我什至将 choices
列表移到了循环中,因此它会在每次迭代时生成,但问题仍然存在。我假设因为列表的元素是相同的对象 tkinter 不区分它们所在的 OptionMenu。看来我每次循环都需要一个唯一的列表。
有什么方法可以限制复选标记只显示在用户与之交互的选项菜单上吗?
这是 OptionMenu
的 ttk 实现中的错误。它没有为每个 OptionMenu 中的单选按钮分配唯一变量。
您可以使用一些代码来解决这个问题。基本上,您必须遍历菜单中的每个项目并设置 variable
属性。
这是一个例子:
def optionmenu_patch(om, var):
menu = om['menu']
last = menu.index("end")
for i in range(0, last+1):
menu.entryconfig(i, variable=var)
...
for each in range(10):
sv = StringVar()
om = OptionMenu(root, sv, choices[0], *choices)
om.pack()
optionmenu_patch(om, sv)
在此示例中,如果用户在任何下拉菜单中选择任何选项,然后单击另一个下拉菜单,则先前选择的项目旁边会显示一个复选标记。即使该选项是在不同的菜单中选择的。
from Tkinter import *
from ttk import *
choices = ['1st Choice', '2nd Choice', '3rd Choice', '4th Choice']
root = Tk()
for each in range(10):
OptionMenu(root, StringVar(), choices[0], *choices).pack()
root.mainloop()
这发生在 Python 2.7 和 3.5 上。
我什至将 choices
列表移到了循环中,因此它会在每次迭代时生成,但问题仍然存在。我假设因为列表的元素是相同的对象 tkinter 不区分它们所在的 OptionMenu。看来我每次循环都需要一个唯一的列表。
有什么方法可以限制复选标记只显示在用户与之交互的选项菜单上吗?
这是 OptionMenu
的 ttk 实现中的错误。它没有为每个 OptionMenu 中的单选按钮分配唯一变量。
您可以使用一些代码来解决这个问题。基本上,您必须遍历菜单中的每个项目并设置 variable
属性。
这是一个例子:
def optionmenu_patch(om, var):
menu = om['menu']
last = menu.index("end")
for i in range(0, last+1):
menu.entryconfig(i, variable=var)
...
for each in range(10):
sv = StringVar()
om = OptionMenu(root, sv, choices[0], *choices)
om.pack()
optionmenu_patch(om, sv)