在此示例中,如果用户在任何下拉列表中选择任何选项,则单击另一个下拉列表,之前选择的项目旁边会显示一个复选标记。即使这个选择是在不同的菜单中选择的。
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上?
答案 0 :(得分:3)
这是OptionMenu
的ttk实施中的错误。它没有为每个OptionMenu中的radiobuttons分配唯一变量。
你可以用一点代码解决这个问题。基本上,您必须遍历菜单中的每个项目并设置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)