【问题标题】:Index of same values in Tkinter Optionmenu widgetTkinter Optionmenu 小部件中相同值的索引
【发布时间】:2015-03-05 18:01:57
【问题描述】:

我正在尝试访问选项菜单小部件中相同值的索引。在以下代码中,无论我选择两个“b”字符中的哪一个,列表中的字符“b”都会返回索引 1。我需要根据列表中的索引位置区分两个“b”字符,即从选项菜单小部件中选择第一个“b”应该返回索引 1,而第二个“b”应该返回索引 2。请告诉我该怎么做。提前致谢。

from Tkinter import *
    
class GUI(Frame):
    
    def __init__(self):
        Frame.__init__(self)
        self.master.title("New window")
        self.master.geometry("300x200")
        self.grid()
            
        self.list1 = ["a", "b", "b"]
    
        self.var = StringVar()
        self.var.set("")
        self.entry = Entry(self, textvariable=self.var)
        self.entry.grid(row=0, column=0)
        self.optionMenu = OptionMenu(self, self.var, *self.list1)
        self.optionMenu.grid(row=0, column=1)
    
        self.button = Button(self, text="Print", command=self.print_fun)
        self.button.grid(row=0, column=2)
    
    def print_fun(self):
        print self.optionMenu["menu"].index(self.var.get())
    
obj = GUI()
    
obj.mainloop()

【问题讨论】:

  • 与 anwser 一样,list1 中的值不能相同。你需要让它们独一无二。

标签: indexing tkinter optionmenu


【解决方案1】:

这不是选项菜单的设计方式。您必须创建一个自定义选项菜单。选项菜单没有什么特别之处,它只是一个按钮和一个菜单,以及几个赋予其行为的功能。

从可用性的角度来看,这是一个非常糟糕的设计,因为用户无法知道第一个“b”选项和第二个“b”选项之间的区别。我希望一个选择不要映射到“停用炸弹”,而另一个选择是“引爆炸弹”。

【讨论】:

  • 虽然 a 同意这个答案,但它忽略了一种情况,即菜单中可能有多个相同的选项,例如,如果我们使用配置文件填充菜单(用于 WPF 的 XAML,用于 Qt 的 UI等等。)。在测试中这是一种可能性,而且大牌框架支持它的事实也证明了它有一些应用。我想说的是,这更像是来自 Tkinter 开发人员的“我不想费心去实现这个”案例。 :D
  • @rbaleksandar:如果您愿意处理它的可用性方面,tkinter 绝对允许您在具有相同文本的菜单上拥有多个选项。对于 99% 以上的所有项目都是唯一字符串的情况,OptionMenu 只是一种快速而简单的解决方案。