在tkinter的OptionMenu中更改默认图标?

16
我想要替换tkinter OptionMenu默认的“盒状图标”,使用自己的图片文件。以下是我目前为止拥有的代码。它正在工作,但是我必须添加最后一行才能显示箭头图像并使OptionMenu正常工作。然而,箭头图像总是出现在文本之后,而不是OptionMenu的极右边,并且粘性似乎没有应用,因此width = 140。我正在Python 2.6中工作。您有移动图像到右边的任何建议吗? Default What I am Getting
...
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
...
4个回答

6
您可以使用 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
@martineau 我对 OptionMenu 不够了解,无法推荐。 - Peter Wood
直到最近我也不知道。在我看来,它们更像是OptionMenu而不是Combobox。搜索一下你就会发现。它们还有文档字符串。 - martineau
1
我明白——即使没有别的,我的评论也会让其他人知道它的存在。 - martineau
2
对于任何感兴趣的人,这里是我发现的一些不错的 ttk.OptionMenu 文档 链接。 - martineau
显示剩余2条评论

5
您可以禁用指示器,然后使用自己的指示器图像。根据需要进一步调整位置。请查看下面的示例代码片段:
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()

4
您可以关闭指示器,并使用compound属性。将箭头作为带有图像且无边框或文本的标签创建。然后,您可以使用place将标签放置在按钮的最右侧(使用relx属性)。这就是place真正擅长的事情。

2
那不起作用,遗憾的是我没有看到一个简单的解决方案。这里的主要问题是OptionMenu是一个复合小部件。它是Menubutton的后代(具有讽刺意味的是,在tkinter源代码中标记为已弃用/过时),并包含一个菜单小部件。
据我所知,您正在使用的图像选项与标签文本一起打包,不会通过您的布局配置尝试进行“分离”。更明智的方法应该是影响指示器小部件/表示,您可以使用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的源代码并将其与原始代码进行比较,这也是为什么你必须在“初始化”后添加第二行的原因。
om.config(indictoron=0,compound='right',image=arrow,width=140)

在真正的源代码中,你可能会发现一个关于按钮是某种单选按钮的初步猜测并不完全错误,但它并不能帮助(至少不是我)解决tkinter问题。:(
很抱歉我没有提供更好的帮助...我真是太丢人了! :( 但下次我会更加努力的! ;-)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接