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

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

4 Solutions collect form web for “Изменение значка по умолчанию в tkinter OptionMenu?”

Это не сработает, и я сожалею, что не вижу легкого решения. Основная проблема заключается в том, что 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. 🙁

Мне жаль, что я не мог лучше использовать … стыдно за меня! 🙁 Но я буду стараться в следующий раз! 😉

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

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

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

ttk.Combobox этого вы можете использовать виджет 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) 
  • Tkinter - Невозможно связать события со стрелкой
  • Значок изменения в окне фигуры Matplotlib
  • Python tkinter: вывести любой вывод в текстовое поле в графическом интерфейсе не в оболочке
  • Размещение графика в главном окне Tkinter в Python
  • Индикатор выполнения TTK блокируется при отправке электронной почты
  • Масштабирование GUI Tkinter в разрешении 4k (3840 * 2160)?
  • Как узнать текущий размер виджета в tkinter?
  • Виджеты Tkinter Toplevel не отображаются - python
  • Python - лучший язык программирования в мире.