【问题标题】:Changing default icon in tkinter OptionMenu?更改 tkinter OptionMenu 中的默认图标?
【发布时间】:2012-11-04 15:24:51
【问题描述】:

我正在尝试从 tkinter OptionMenu 中删除默认的“box like”图标,并将其替换为我自己的图像文件。下面是我必须迄今为止的代码。它正在工作,但我必须添加最后一行才能显示箭头图像并让 OptionMenu 起作用。但是,箭头图像总是在文本之后而不是在 OptionMenu 的最右侧,并且粘性不会被应用,因此宽度 = 140。我正在使用 Python 2.6。

将图像向右移动有什么建议吗?

...
arrow = PhotoImage(file='arrow.gif')
om = OptionMenu(root,myVar,*myOptList)
om.grid(sticky=W+E,padx=5,pady=5)
om.config(indictoron=0,compound='right',image=arrow,width=140)
om.image=arrow
...

【问题讨论】:

    标签: python tkinter optionmenu


    【解决方案1】:

    您可以改用ttk.Combobox 小部件:

    om = Combobox(root, values=*myOptList)
    om.set(myVar)
    om.grid(sticky=W + E, padx=5, pady=5)
    om.config(compound='right', width=140)
    

    【讨论】:

    • 为什么不是ttk.OptionMenu
    • @martineau 我对OptionMenu 了解不够,无法推荐它。
    • 直到最近我都没有。它们比 IMO 中的 Combobox 更像 OptionMenu。搜索,你会找到的。他们也有文档。
    • 我明白——如果没有别的,我的评论会让其他人知道它的存在。
    • 对于任何感兴趣的人,这是我找到的一些好的ttk.OptionMenu documentation 的链接。
    【解决方案2】:

    您可以禁用指示器,然后使用您自己的指示器图像。进一步调整适合的位置。检查下面的示例 sn-p:

    from Tkinter import*
    import PIL
    from PIL import ImageTk, Image
    
    class MyOptionMenu(OptionMenu):
        def __init__(self, master, status, *options):
            self.var = StringVar(master)
            self.img = ImageTk.PhotoImage(Image.open("...")) #replace with your own indicator image
            self.var.set(status)
            OptionMenu.__init__(self, master, self.var, *options)
            self.config(indicatoron=0, image = self.img, font=('calibri',(10)),bg='white',width=12)
            self['menu'].config(font=('calibri',(10)),bg='white')
    
    root = Tk()
    mymenu = MyOptionMenu(root, 'Select status', 'a','b','c')
    mymenu.pack()
    root.mainloop()
    

    【讨论】:

      【解决方案3】:

      你可以关闭指示器,不能使用compound属性。将箭头创建为带有图像且没有边框或文本的标签。然后,您可以使用place 将标签放在按钮的最右侧(使用relx 属性)。这是place 真正擅长的类型。

      【讨论】:

        【解决方案4】:

        那行不通,很遗憾,我没有看到一个简单的解决方案。这里的主要问题是,OptionMenu 是一个复合小部件。它是 Menubutton 的后代(具有讽刺意味的是,它在 tkinter 源代码中被标记为已弃用/过时)并包含一个菜单小部件。

        Afaik 您正在使用的图像选项与标签文本打包在一起,并且不会通过您的布局配置尝试“分离”。更理智的方法应该是影响您使用IndicatorOn=0 禁用的指标小部件/表示。但也没有运气,因为我就是不知道指标到底是什么......

        顺便说一句,它看起来像一个可怕的黑客:

        class OptionMenu(Menubutton): 
        """OptionMenu which allows the user to select a value from a menu.""" 
            def __init__(self, master, variable, value, *values, **kwargs):
            ...
            #'command' is the only supported keyword  <--- lol?! WTF?! why?
                      callback = kwargs.get('command') 
                      if kwargs.has_key('command'): 
                          del kwargs['command'] 
                      if kwargs: 
                         raise TclError, 'unknown option -'+kwargs.keys()[0] # yeah sure! - unknown my a** 8-/
        

        如果您查看 tkinter 的 source 并将其与 original 进行比较。 这也是为什么你必须在“初始化”之后添加第二行的原因

        om.config(indictoron=0,compound='right',image=arrow,width=140)
        

        在您可能会发现的真实来源中,最初的预感是按钮是 某种单选按钮,离该领域不远,但无济于事 (至少不是我)来解决 tkinter 问题。 :-(

        对不起,我没有更好的用处....真丢脸! :(但我会更加努力 下一次! ;-)

        【讨论】:

          猜你喜欢
          • 2020-10-06
          • 1970-01-01
          • 2014-11-09
          • 2012-04-30
          • 1970-01-01
          • 2012-05-07
          • 2018-05-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多