Изменение значка по умолчанию в tkinter OptionMenu?
Я пытаюсь удалить значок "box like" по умолчанию из tkinter OptionMenu и заменить его собственным файлом изображения. ниже приведен код, который я имею на сегодняшний день. Он работает, но мне пришлось добавить последнюю строку, чтобы отобразить изображение стрелки и функцию OptionMenu. Тем не менее, изображение стрелки всегда верно после текста, а не в крайнем правом углу OptionMenu, и липкий - это не шов, а следовательно, ширина = 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
...
Ответы
Ответ 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()