2012-11-04 19 views
13

Ich versuche, das Standard "box like" Symbol aus dem tkinter OptionMenu zu entfernen und es durch meine eigene Bilddatei zu ersetzen. unten ist der Code, den ich bis heute habe. Es funktioniert, aber ich musste die letzte Zeile hinzufügen, damit das Pfeilbild angezeigt wird und das OptionMenu funktioniert. Das Pfeilbild befindet sich jedoch immer genau hinter dem Text und nicht ganz rechts im Optionsmenü, und klebrig wird nicht als Folge dargestellt, daher ist die Breite = 140. Ich arbeite in Python 2.6.Ändern des Standard-Symbols in tkinter OptionMenu?

Alle Einstellungen zum Verschieben des Bildes nach rechts?

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 
... 

Antwort

2

, die nicht funktionieren und regretable ich nicht eine einfache Lösung sehen. Das Hauptproblem hierbei ist, dass OptionMenu ein zusammengesetztes Widget ist. Es ist ein Nachkomme von Menubutton (der in der tkinter-Quelle ironischerweise als veraltet/obsolet markiert ist) und enthält ein Menü-Widget.

Afaik die Bild-Option, die Sie verwenden, ist zusammen mit dem Label-Text verpackt und wird nicht durch Ihre Layout-Konfigurationsversuche "loslösen". Der vernünftigere Ansatz sollte sein, das Indikator-Widget/die Darstellung zu beeinflussen, die Sie mit IndicatorOn=0 deaktiviert haben. Aber kein Glück gibt es entweder, weil ich kann einfach nicht herausfinden, was zum Teufel der Indikator ...

Btw irgendwie sieht es aus wie eine schreckliche Hack:

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-/ 

, wenn man sich die source von tkinter und vergleichen Sie es mit der original. Das ist auch der Grund, warum Sie eine zweite Zeile nach der „Initialisierung“

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

In der Original-Quelle hinzufügen müssen Sie feststellen können, dass eine anfängliche Vermutung über die Schaltfläche eine Art von Radiobutton zu sein, ist nicht so weit außerhalb des Feldes, aber es hilft nicht (zumindest nicht ich), um das Problem tkinter zu lösen. :-(

Es tut mir leid ich nicht auf mir jeder eine bessere Nutzung .... schade sein könnte! :(Aber ich werde das nächste Mal mehr anstrengen! ;-)

2

können Sie Schalten Sie den Indikator aus, und nicht Verwenden Sie das Attribut. Erstellen Sie den Pfeil als eine Beschriftung mit einem Bild und keine Rahmen oder Text.Sie ​​können dann place verwenden, um die Beschriftung auf der rechten Seite der Schaltfläche (mit dem Attribut relx) Dies ist die Art der Sache place ist wirklich gut in.

2

Sie können stattdessen die ttk.Combobox Widget verwenden:

om = Combobox(root, values=*myOptList) 
om.set(myVar) 
om.grid(sticky=W + E, padx=5, pady=5) 
om.config(compound='right', width=140) 
2

Sie können den Indikator deaktivieren und dann ein eigenes Indikatorbild verwenden. Passen Sie die Position weiter an, wie es Ihnen passt. Überprüfen Sie das folgende Schnipsel:

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