Farbe im Anzeigefeld eines Dropdown-Menus ändert sich

Fragen zu Tkinter.
Antworten
World_of_Tanks
User
Beiträge: 14
Registriert: Donnerstag 25. April 2019, 14:44

Hallo zusammen!

Ich bin völlig neu in Python und experimentiere gerade mit Dropdown-Menüs. Ich möchte das sich die Schriftfarbe der Anzeige (des Dropdowns) ändert, wenn ich einen gewissen Menüpunkt auswähle. Das habe ich mit meinen rudimentären Kenntnissen auch hinbekommen (es geht wohl auch besser). Mein Problem ist, dass sich die Farbe zurückändert, wenn ich mit der Maus über das Dropdown-Menü fahre (von rot zu schwarz). Gibt es eine Möglichkeit das zu verhindern? Oder sollte ich es ganz anders aufziehen? Hier der aktuelle Stand.

from tkinter import *
import tkinter as tk

def select(event):
if akt.get() != "TW":
dd_Menu.config(fg="red")
dd_Menu.update()
else:
dd_Menu.config(fg="black")
dd_Menu.update()

main_menu = Tk()
akt = StringVar(main_menu)

auswahl = ["TW", "LIB", "VT", "RVT", "LVT", "MMF", "RMF", "LMF", "SPM", "MST", "RST", "LST"]

dd_Menu = OptionMenu(main_menu, akt, command=select, *auswahl)
dd_Menu.pack()

main_menu.mainloop()
Benutzeravatar
__blackjack__
User
Beiträge: 13067
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@World_of_Tanks: Wahrscheinlich nicht ganz zu schwarz sondern ein bisschen heller als Schwarz – das ist die aktive Vordergrundfarbe, die angezeigt wird, wenn man mit der Maus über dem Menü ist.

Sonstige Anmerkungen: Namen schreibt man in Python klein_mit_unterstrichen. Ausnahmen: Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).

Die erste Importzeile sollte man nicht machen sondern die zweite auch tatsächlich verwenden.

Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

Code: Alles auswählen

#!/usr/bin/env python3
import tkinter as tk

SPECIAL_COLORS = {'foreground': 'red3', 'activeforeground': 'red1'}


class Menu(tk.OptionMenu):
    
    def __init__(self, master, variable, value, *values, **kwargs):
        kwargs['command'] = self.on_select
        tk.OptionMenu.__init__(self, master, variable, value, *values, **kwargs)
        self.variable = variable
        self.special_colors = SPECIAL_COLORS
        self.default_colors = {key: self[key] for key in self.special_colors}
        
    def on_select(self, _event):
        if self.variable.get() != 'TW':
            self.config(**self.special_colors)
        else:
            self.config(**self.default_colors)


def main():
    window = tk.Tk()
    variable = tk.StringVar(window)
    auswahl = [
        'TW', 'LIB', 'VT', 'RVT', 'LVT', 'MMF',
        'RMF', 'LMF', 'SPM', 'MST', 'RST', 'LST',
    ]
    menu = Menu(window, variable, *auswahl)
    menu.pack()

    window.mainloop()


if __name__ == '__main__':
    main()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
World_of_Tanks
User
Beiträge: 14
Registriert: Donnerstag 25. April 2019, 14:44

Vielen Dank!

Funktioniert hervorragend. Nur für die Zunkunft; Was benutzt ihr (oder was muss man tun), um den Text so zu formatieren, dass er wie Python Code aussieht?
Benutzeravatar
__blackjack__
User
Beiträge: 13067
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@World_of_Tanks: Code Tags setzen. Entweder manuell, oder im vollständigen Beitragseditor über die Schaltfläche die mit „< / >“ beschriftet ist. Kannst bei meinem letzten Beitrag auch auf zitieren klicken um zu sehen wie das im Quelltext des Beitrags aussieht.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi World_of_Tanks

Hier noch eine andere Variante:

Code: Alles auswählen

import tkinter as tk

def select(event):
    if akt.get() != "TW":
        dd_Menu.config(fg="red", activeforeground='red')
    else:
        dd_Menu.config(fg="black", activeforeground='black')

main_menu = tk.Tk()
akt = tk.StringVar(main_menu, 'Leer')

auswahl = ["TW", "LIB", "VT", "RVT", "LVT", "MMF", "RMF", "LMF", "SPM", "MST", "RST", "LST"]

dd_Menu = tk.OptionMenu(main_menu, akt, command=select, *auswahl)
dd_Menu.pack()
dd_Menu.config(width=6)

main_menu.mainloop()
Gruss wuf :-)
Take it easy Mates!
World_of_Tanks
User
Beiträge: 14
Registriert: Donnerstag 25. April 2019, 14:44

@__blackjack__ Danke für den Hinweis. Hab's mir angesehen. Da kommt ja kein Mensch drauf xD

@wuf Dankeschön. Es ist immer gut ein paar Varianten zu sehen.
Antworten