更改tkinter OptionMenu中的默认图标?

13 python tkinter optionmenu

我试图从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
...
Run Code Online (Sandbox Code Playgroud)

Pet*_*ood 5

您可以改用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)
Run Code Online (Sandbox Code Playgroud)

  • 对于任何感兴趣的人,这里有一个我发现的一些好的“ttk.OptionMenu”[文档](https://www.pythontutorial.net/tkinter/tkinter-optionmenu/)的链接。 (2认同)

Har*_*der 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()
Run Code Online (Sandbox Code Playgroud)


Don*_*ion 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-/
Run Code Online (Sandbox Code Playgroud)

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

om.config(indictoron=0,compound='right',image=arrow,width=140)
Run Code Online (Sandbox Code Playgroud)

在真正的来源中,您可能会发现,关于该按钮是某种单选按钮的最初预感并不是太离谱,但它对解决 tkinter 问题没有帮助(至少对我没有帮助)。:-(

很抱歉我不能有任何更好的用处......我真丢脸!:( 但下次我会更加努力!;-)