Farbe ändern mit Button-Click

Fragen zu Tkinter.
Antworten
MissMapeL
User
Beiträge: 22
Registriert: Mittwoch 30. Oktober 2019, 10:26

Hallo,
bin Anfänger. Mein Programm sieht z.Zt. so aus:

import tkinter

farbe = "#FF00FF"
fb = 0

# Anzeigefunktion
def FarbeEingeben():
farbe = t.get()
main.config(background = farbe) #"#FF00FF"

# Farbe ändern
def FarbeAendern():
fb = fb + 1
farbe = "#F" + str(fb) + "55FF"
main.config(background = farbe) #"#FF00FF"
main.title(fb)


main = tkinter.Tk()
main.geometry('800x400')

t = tkinter.Entry(main)
t.pack()

bshow = tkinter.Button(main, text = "Anzeigen", command = FarbeEingeben)
bshow.pack()

bfarbe = tkinter.Button(main, text = "Farbe ändern", command = FarbeAendern)
bfarbe.pack()

main.mainloop()

geplant war mit dem FarbeAendern-Button bei jedem Click den Farbstring zu erhöhen. Aber ich habe ein Problem mit 'fb'.

Was mache ich falsch???
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Es wäre gut, wenn Du auch den Fehler posten würdest, der kommt.
Das ist das übliche Problem, dass man für GUIs eigentlich Klassendefinitionen braucht, wenn man zusätzlichen Zustand (Farbe) speichern will.

Code: Alles auswählen

import tkinter as tk

class MainWindow(tk.Tk):
    def __init__(self):
        super().__init__()
        self.geometry('800x400')
        self.farbe = 0x0055FF
        tk.Button(self, text="Ändern", command=self.farbe_aendern).pack()

    def farbe_aendern(self):
        self.farbe += 0x100000
        print(f"#{self.farbe:06X}")
        self['background'] = f"#{self.farbe:06X}"

def main():
    window = MainWindow()
    window.mainloop()

if __name__ == '__main__':
    main()
MissMapeL
User
Beiträge: 22
Registriert: Mittwoch 30. Oktober 2019, 10:26

Danke für die schnelle Antwort!

Bei mir erscheint die Fehlermeldung: local variable 'fb' referenced before assignment.

Ziel wäre es den Farbstring bei jedem Button-Click um einen Wert zu erhöhen.

Während die Variable 'farbe' offensichtlich problemlos verarbeitet wird, führt 'fb' zum obigen Fehler.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

In Python ist jede Variable, die geändert wird, eine lokale Variable. Namen die keinen neuen Wert bekommen sind Konstanten oder Funktionen, wobei man Konstanten dadurch erkennen sollte, dass sie KOMPLETT_GROSS geschrieben sind. Das `farbe` aus der dritten Zeile wird auch nie verwendet, sondern nur das lokale `farbe` in `FarbeEingeben` das den Wert von t.get() bekommt.
`fb` bekommt einen neuen Wert, ist also lokal, aber bevor es einen Wert bekommt, wird aber gefragt, was denn der aktuelle Wert ist, und der existiert noch nicht.
Wie man das Problem umgehen kann, habe ich Dir ja gezeigt.
Antworten