Seite 1 von 1

OptionMenu - Unterschiedl. Farben der Eintraege?

Verfasst: Samstag 12. Juli 2008, 23:48
von till129
Hallo,

ich benoetige ein Widget mit dem ich zwischen wenigen Farben
auswaehlen kann.

Mit OptionMenu kann ich diese Eintraege bereits erstellen:

Code: Alles auswählen

from Tkinter import *

master = Tk()

variable = StringVar(master)
variable.set('green') # default value

w = OptionMenu(master, variable, 'green', 'red', 'blue')
w.pack()

mainloop()
Gibt es eine Moeglichtkeit die Schriftfarbe der einzelnen Eintraege
zu aendern?

(Der tkColorChooser ist fuer mich zu umfangreich.)

Danke fuer jede Hilfe,
Till

Verfasst: Sonntag 13. Juli 2008, 10:05
von wuf
Hallo till129

Hier ein Lösungsansatz:

Code: Alles auswählen

from Tkinter import *

master = Tk()

colors = ('green', 'red', 'blue','yellow','mistyrose','purple')

variable = StringVar(master)
variable.set('mistyrose') # default value

w = OptionMenu(master, variable, *colors) # 'green', 'red', 'blue')
w.pack()


for index in xrange(len(colors)):
    bg_color = colors[index]
    w['menu'].entryconfig(index,background=bg_color,activebackground=bg_color)

mainloop()
Getestet mit SuSE 10.0 Python2.4 Python2.5

Gruss wuf :wink:

Verfasst: Sonntag 13. Juli 2008, 10:28
von till129
Ausgezeichnet. Das ist genau dass, was ich brauche.

Vielen Dank auch!!!! Till

Verfasst: Sonntag 13. Juli 2008, 12:55
von till129
Mit folgendem Code aendert sich zudem auch die Hintergrundfarbe
des OptionMenu.

Weiss jemand wie man verhindert, dass die Hintergrundfarbe
weg geht, wenn man die Maus ueber dem OptionMenu hat?

Code: Alles auswählen

from Tkinter import *

#----------------GUI CLASS DEFINITION-------------------
class App:
    def __init__(self, master):

        self.colors = ('green', 'red', 'blue','yellow','mistyrose','purple')
    
        self.variable = StringVar(master)
        self.variable.set('mistyrose') # default value
    
        self.w = OptionMenu(master, self.variable, *self.colors)
        self.w.pack()
    
    
        for index in xrange(len(self.colors)):
            bg_color = self.colors[index]
            self.w['menu'].entryconfig(index,background=bg_color,activebackground=bg_color)
    
        # idea: watch the OptionMenu Textvariable
        self.variable.trace_variable('w', self.callbackFunc)
        
    def callbackFunc(self, name, index, mode):
        print self.variable.get()
        self.w.configure(background=self.variable.get())
        

        
    
#--------------Start GUI--------------------------------
root = Tk()
app = App(root)
root.mainloop()

Verfasst: Sonntag 13. Juli 2008, 17:25
von wuf
Hallo till119

Wie ich sehe haben sich unsere Arbeiten überlappt. Dem Kreator des Option-Menu Widget muss ich leider die Note 'lausig' für seine Dokumentations-Unterstützung erteilen. :evil:

Hier ist mein neuster Ansatz:
Die Schriftfarbe der Option-Menu-Schaltfläche korrelier mit der Selektion. Wenn sich die Maus über der Schaltfläche befindet bleibt die Farbe unverändert.

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

#~~ Skriptname till119_01_03_01.py (13.07.2008)

import Tkinter as tk

def my_color(color):
    """Auswahlmenu-Rückruf"""

    variable.set(color)
    w.configure(fg=color,activeforeground=color)

master = tk.Tk()

colors = ('green', 'red', 'blue','yellow','mistyrose','purple')

variable = tk.StringVar()

w = tk.OptionMenu(master, variable, *colors)
w.pack()

my_color('red')

for index in xrange(len(colors)):
    fg_color = colors[index]
    w['menu'].entryconfig(index,
        foreground=fg_color,
        activeforeground=fg_color,
        command = lambda color=colors[index]: my_color(color)
        )

master.mainloop()
Gruss wuf :wink:

Verfasst: Sonntag 13. Juli 2008, 17:39
von till129
Gute Idee der internen Editbox ne Callback Funktion zu geben.

Ja, die Dokumentation ist wirklich schlecht. Ausserdem taucht
in dem beliebten 'an-introduction-to-tkinter.pdf' dieses Widget nicht auf.
Ist warscheinlich auch der Grund, warum hier im Forum so oft nach
einer ComboBox gefragt wird...

danke nochmals,
till