Seite 1 von 1

Hintergrundfarbe beim label ändern

Verfasst: Sonntag 22. August 2021, 14:24
von reiwe3
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()

Re: Hintergrundfarbe beim label ändern

Verfasst: Sonntag 22. August 2021, 15:29
von rogerb
@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.

Re: Hintergrundfarbe beim label ändern

Verfasst: Sonntag 22. August 2021, 16:19
von __blackjack__
Einen Zähler kann man sich mit `itertools.cycle()` sparen.

Re: Hintergrundfarbe beim label ändern

Verfasst: Sonntag 22. August 2021, 16:22
von Sirius3
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()

Re: Hintergrundfarbe beim label ändern

Verfasst: Montag 23. August 2021, 18:48
von reiwe3
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.

Re: Hintergrundfarbe beim label ändern

Verfasst: Montag 23. August 2021, 20:04
von Dennis89
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.

Re: Hintergrundfarbe beim label ändern

Verfasst: Mittwoch 25. August 2021, 15:34
von reiwe3
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

Re: Hintergrundfarbe beim label ändern

Verfasst: Mittwoch 25. August 2021, 16:10
von rogerb
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()

Re: Hintergrundfarbe beim label ändern

Verfasst: Mittwoch 25. August 2021, 19:36
von reiwe3
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.