Hintergrundfarbe beim label ändern

Fragen zu Tkinter.
Antworten
reiwe3
User
Beiträge: 12
Registriert: Samstag 21. August 2021, 14:46

Hallo Experts,
Meine Anfänge im Programmieren liegen lange zurück. Auch in der Automatisierrung dort zb. Bit-Programmierung (oder verschiedene scripts). Jetzt will ich einige Hardware-Teile per Software simulieren.
In loser Reihenfolge habe ich mich mit Python angefreundet. Ich habe ein kleines Programm ---zusammengefunden –- das funktiomiert, ich möchte dazu noch ein blinkendes label einbauen. Das Beispiel arbeitet mit einem Sekundentakt. Im Takte diese Wertes (Wert gerade = grün, ungerade = rot) soll ein Blinker label die Hintergrundfarbe wechseln . Mein Problem: das Configurieren des labels. Wie kann ich das richtig configurieren? Danke für alle Vorschläge

import tkinter as tk
counter = 0
def counter_label1(label1):
def count():
global counter
counter += 1
label1.config(text=str(counter))
label1.after(1000, count)
#blinker aus counter erzeugen:label-Farbe soll wechseln bei gerade/ungerade
farb_wechsel= int(counter) % 2
if farb_wechsel ==1:
farbe= "red"
print(farbe)
if farb_wechsel ==0:
farbe= "green"
print(farbe)
count()
root = tk.Tk()
root.title("Zähler und Blinker")
root.minsize(width=400, height=200)
label1 = tk.Label(root, fg="green")
label1.pack(padx=40, pady=30)
counter_label1(label1)
label2=tk.Label(text="Blinker").pack(padx= 30, pady= 30)
button = tk.Button(root, text='Ende',fg= "red",width=20, command=root.destroy)
button.pack()
root.mainloop()
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@reiwe3,

statt "print(farbe)"

kannst du die Labelfarbe so ändern:

Code: Alles auswählen

label1.config(fg=farbe) # für die Schriftfarbe
oder:

Code: Alles auswählen

label1.config(bg=farbe) # für die Hintergrundfarbe
Statt der globalen Variable wäre es besser eine Klasse für die Applikation anzulegen, die den Zählerstand intern verwaltet.
Benutzeravatar
__blackjack__
User
Beiträge: 13080
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Einen Zähler kann man sich mit `itertools.cycle()` sparen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Engerückt wird immer mit 4 Leerzeichen pro Ebene, nicht mal 4 und mal 2.
Variablennamen sollten aussagekräftig sein, eine Zahl ein einem Generischen Namen (label1) ist das nicht. `label2` enthält gar keinen sinnvollen Wert.

Code: Alles auswählen

import tkinter as tk

def blink(blinker, counter=1):
    blinker['text'] = counter
    blinker['fg'] = "red" if counter % 2 else "green"
    blinker.after(1000, blink, blinker, counter + 1)

def main():
    root = tk.Tk()
    root.title("Zähler und Blinker")
    root.minsize(width=400, height=200)
    blinker = tk.Label(root, fg="green")
    blinker.pack(padx=40, pady=30)
    blink(blinker)
    tk.Label(text="Blinker").pack(padx=30, pady= 30)
    tk.Button(root, text='Ende',fg= "red",width=20, command=root.destroy).pack()
    root.mainloop()

if __name__ == "__main__":
    main()
reiwe3
User
Beiträge: 12
Registriert: Samstag 21. August 2021, 14:46

Danke sirius3,
das funktioniert für das label blink dies wechselt sehr gut !!
Ich will aber das label2 blinken lassen, ich habe das label2 in led umgetauft.
diese led mit dem Text (" Blinker ") soll die Hintergrundfarbe wechseln.
Wenn ich jetzt in deinem Programm den blinker['bg'] = "red" if counter % 2 else "green"
in led['bg'] = "red" if counter % 2 else "green" verändere kommt die Fehlermeldung : NameError: name 'led' is not defined
das ist mir soweit klar, trotzdem kann ich das led nicht definieren dass es die Farbe wechselt.
Benutzeravatar
Dennis89
User
Beiträge: 1153
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

kannst du uns den Code zeigen? Aus deiner Beschreibung kann ich nicht erraten was du genau gemacht hast.

Du darfst nicht nur einen Namen ändern, du musst darauf achten wo und wie die Namen übergeben werden. Schau mal, in 'main' wird 'blinker' an 'blink' übergeben. In der Funktion kann man den "Inhalt" von 'blinker' an einen neuen Namen binden.
Ich finde mein Bsp. nicht schön zu lesen, aber vielleicht verdeutlicht es den Umgang mit Argumenten und die Gültigkeit von Namen.

Code: Alles auswählen

import tkinter as tk

def blink(led, counter=1):
    led['bg'] = "red" if counter % 2 else "green"
    led.after(1000, blink, led, counter + 1)

def main():
    root = tk.Tk()
    root.title("Zähler und Blinker")
    root.minsize(width=400, height=200)
    blinker = tk.Label(root, fg="green")
    blinker.pack(padx=40, pady=30)
    blink(blinker)
    tk.Label(text="Blinker").pack(padx=30, pady= 30)
    tk.Button(root, text='Ende',fg= "red",width=20, command=root.destroy).pack()
    root.mainloop()

if __name__ == "__main__":
    main()
Grüße
Dennis

Edit: Es ist nicht mein Code, ich habe den von @Sirius3 abgeändert.
"When I got the music, I got a place to go" [Rancid, 1993]
reiwe3
User
Beiträge: 12
Registriert: Samstag 21. August 2021, 14:46

Hallo,
sorry, sorry, ich glaube bei meinen posts scheint etwas durcheinander gekommen zu sein.
Mein letzter post ist verschwunden! Ich habe den mit der Schnellantwort gemacht.
Ich habe mein Projekt noch einmal überarbeitet, so dass es etwas übersichtlicher
ist. Es sind jetzt 3 Funktionen: zt_zaehler, blinker, und die gui.
den Code:
import tkinter as tk

def zt_zaehler(zaehl, counter=1):
zaehl['text'] = counter
zaehl.after(1000, zt_zaehler,zaehl, counter + 1)
blinker(counter)

def blinker(counter):
umsch=int(counter)%2
if umsch==1: #Farbumschlag
farbe="green"
else:
farbe="red"
led=tk.Label()
led.config(bg=farbe)

def main():
root = tk.Tk()
root.title("Zähler und Blinker")
root.minsize(width=400, height=200)
zaehl = tk.Label(root, fg="green")
zaehl.pack(padx=40, pady=30)
zt_zaehler(zaehl)
led=tk.Label(root,text="Blinker").pack(padx=30, pady= 30)
tk.Button(root, text='Ende',fg= "red",width=20, command=root.destroy).pack()
root.mainloop()

if __name__ == "__main__":
main()

also die funktion zt_zaehler arbeitet richtig!
Mein Problem ist in der Funktion blinker, dort soll der Label led in der GUI blinken, aber beim Übergeben in die GUI bzw. das config
arbeitet nicht, in der led=tk.Label kommt nichts an.
Vielleicht weiss jemand rat
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

reiwe3,

du erzeugst in der blinker Funktion bei jedem Durchlauf ein neues Label. Statt dessen sollte das bestehende Label an die Funktion übergeben werden.

Die Abkürzungen in den Variablennamen sind verwirrend. Wenn man anderen seinen Code zeigt empfiehlt es sich aussagekräftige Namen zu verwenden. (Möglichst auf Englisch)

Code: Alles auswählen

import tkinter as tk


def count_call_back(count_label, led_label, counter_value=1):
    count_label["text"] = counter_value
    count_label.after(1000, count_call_back, count_label, led_label, counter_value + 1)
    switch_label_color(counter_value, led_label)


def switch_label_color(counter_value, led_label):
    if counter_value % 2 == 1:  # Farbumschlag
        color = "green"
    else:
        color = "red"
    led_label["bg"] = color


def main():
    root = tk.Tk()
    root.title("Zähler und Blinker")
    root.minsize(width=400, height=200)
    count_label = tk.Label(root, fg="green")
    count_label.pack(padx=40, pady=30)
    led_label=tk.Label(root,text="Blinker")
    led_label.pack(padx=30, pady= 30)
    count_call_back(count_label, led_label)
    tk.Button(root, text="Ende", fg="red", width=20, command=root.destroy).pack()
    root.mainloop()


if __name__ == "__main__":
    main()
reiwe3
User
Beiträge: 12
Registriert: Samstag 21. August 2021, 14:46

danke, rogerb genau so soll es gehen!!. Du hast recht, bei der Vergabe der Variablen muss ich sorgfältiger sein!
Genau bei der Übergabe hatte ich Probleme.
Danke nochmals.
Antworten