OptionMenu - Unterschiedl. Farben der Eintraege?

Fragen zu Tkinter.
Antworten
till129
User
Beiträge: 7
Registriert: Samstag 12. Juli 2008, 23:28

Samstag 12. Juli 2008, 23:48

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
Benutzeravatar
wuf
User
Beiträge: 1419
Registriert: Sonntag 8. Juni 2003, 09:50

Sonntag 13. Juli 2008, 10:05

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:
Zuletzt geändert von wuf am Sonntag 13. Juli 2008, 10:32, insgesamt 1-mal geändert.
Take it easy Mates!
till129
User
Beiträge: 7
Registriert: Samstag 12. Juli 2008, 23:28

Sonntag 13. Juli 2008, 10:28

Ausgezeichnet. Das ist genau dass, was ich brauche.

Vielen Dank auch!!!! Till
till129
User
Beiträge: 7
Registriert: Samstag 12. Juli 2008, 23:28

Sonntag 13. Juli 2008, 12:55

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()
Benutzeravatar
wuf
User
Beiträge: 1419
Registriert: Sonntag 8. Juni 2003, 09:50

Sonntag 13. Juli 2008, 17:25

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:
Take it easy Mates!
till129
User
Beiträge: 7
Registriert: Samstag 12. Juli 2008, 23:28

Sonntag 13. Juli 2008, 17:39

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
Antworten