Подтвердить что ты не робот

Изменение значка по умолчанию в tkinter OptionMenu?

Я пытаюсь удалить значок "box like" по умолчанию из tkinter OptionMenu и заменить его собственным файлом изображения. ниже приведен код, который я имею на сегодняшний день. Он работает, но мне пришлось добавить последнюю строку, чтобы отобразить изображение стрелки и функцию OptionMenu. Тем не менее, изображение стрелки всегда верно после текста, а не в крайнем правом углу OptionMenu, и липкий - это не шов, а следовательно, ширина = 140. Я работаю в Python 2.6.

Любые ошибки для перемещения изображения вправо?

DefaultWhat 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
...
4b9b3361

Ответ 1

Это не сработает, и я сожалею, что не вижу легкого решения. Основная проблема заключается в том, что OptionMenu является составным виджетами. Это потомок Menubutton (который по иронии судьбы отмечен как устаревший /obsolte в источнике 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 и сравните его с оригинал. Это также причина, по которой вам нужно добавить вторую строку после "инициализации"

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

В подлинном источнике вы можете обнаружить, что начальная догадка о кнопке какой-то радиобуй, не так далеко от поля, но это не помогает (по крайней мере, не я) для решения проблемы tkinter.: - (

Мне жаль, что я не мог лучше использовать... стыдно за меня!:( Но я постараюсь усерднее в следующий раз!; -)

Ответ 2

Вы можете отключить индикатор, а не использовать атрибут compound. Создайте стрелку как метку с изображением, без границ или текста. Затем вы можете использовать place, чтобы поместить метку в крайнем правом углу кнопки (используя атрибут relx). Это тип вещи place действительно хорош.

Ответ 3

Вместо этого вы можете использовать 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)

Ответ 4

Вы можете отключить индикатор, а затем использовать свой собственный индикатор. Затем отрегулируйте положение по своему усмотрению. Проверьте пример фрагмента ниже:

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()