ttk.OptionMenu()在所有菜单

时间:2015-11-20 16:16:33

标签: python tkinter optionmenu

在此示例中,如果用户在任何下拉列表中选择任何选项,则单击另一个下拉列表,之前选择的项目旁边会显示一个复选标记。即使这个选择是在不同的菜单中选择的。

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上?

1 个答案:

答案 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)

错误跟踪器问题:http://bugs.python.org/issue25684