Ergebnis 1 bis 3 von 3

(Globale?) Variablen in Python

  1. #1 Zitieren
    Veteran
    Registriert seit
    Jun 2012
    Beiträge
    630
    Ich versuche mich gerade an Python. Ein ganz simples kleines Test-Projekt:
    Wenn man das Programm startet, wird ein Fenster geöffnet, in das das Hauptmenü gemalt wird, das drei Buttons enthält.
    Dann kann man daraufklicken und je nachdem, welcher es war, wird Level 1, 2 oder 3 ins Fenster gemalt.
    Die Grafiken dafür sind bloß Test-Kritzeleien mit den Namen "testmenu.png" "testlvl1.png" "testlvl2.png" etc.

    (Einrücken funktioniert hier nicht, ich mach das mit Punkten....)

    VORWEG HABE ICH VERSUCHT, DIESE ALS GLOBALE VARIABLE ZU DEFINIEREN

    Hintergrundbild = 1

    HIER IST DIE FUNKTION, FÜR DEN BUTTON-CLICK

    def Knopfdruck1():
    ....print("um 1 erhöht")
    ....imgMenu = PhotoImage(file="testlvl2.png")
    ....Hintergrundbild += 1


    HIER IST DIE FUNKTION ZUM FENSTER-MALEN

    def Fenster():
    ....fenster = Tk()
    ....fenster.geometry("1200x900")

    ....#Hintergrund-Bild zeichnen, bevor die Buttons gezeichnet werden
    ....imgMenu = PhotoImage(file="testmenu.png")
    ....menuhintergrund = Label(fenster,image=imgMenu)
    ....menuhintergrund.place(x=0,y=0)

    ....knopf1 = Button(fenster,text="lvl1",command=Knopfdruck1)
    ....knopf1.place(x=450,y=100) #wohin soll der Button
    ....fenster.mainloop() #Fenster zeichnen wird immer wiederholt, damit das Programm nicht aus geht

    Fenster()


    PROBLEM:

    Ganz einfach gesagt: Wie kriege ich es hin, dass sich zwei verschiedene Funktionen (die Fenster-Funktion und die Buttonclick-Funktion) eine Variable teilen können?

    Ich hätte gern entweder, dass außerhalb der Funktionen definiert wurde
    "Hintergrundbild = 1"
    aber bei Buttonclick wird dieses um 1 erhöht (und gespeichert)
    und dann guckt die Fenster-Funktion
    "if Hintergrundbild == 2, dann male das zweite png-Bild".

    Aber ich kriege immer die Meldung, dass die angeblich lokale Variable "Hintergrundbild" (die ich zu allererst, noch vor den Funktionen, definiert hatte, benutzt würde, bevor sie definiert ist.

    Und wenn man das nicht mit so einer Variablen machen würde, wäre es auch voll praktisch, wenn der Buttonclick einfach das andere PNG-Bild in die Variable "imgMenu" laden würde.
    Aber das geht nicht, weil imgMenu tatsächlich eine lokale Variable von der Fenster-Funktion ist.

    Wie mache ich die Variablen existent unabhängig von den Funktionen, die sie benutzen sollen, und lasse dann diverse Funktionen etwas an ihnen ändern und die Änderung auch abspeichern?


    Also was ich brauche ist das:

    Variable = 1

    Funktion fürs Fenster()
    ....malt Hintergrund1, if Variable ist 1
    ....malt Hintergrund 2, if Variable ist 2
    ....malt einen Button ins Fenster, if Variable ist 1
    ....und muss aber Fenster.mainloop immer wieder malen, damit Programm nicht ausgeht

    Funktion für ButtonClick()
    ....Variable += 1 und speichert das
    ....ODER: lädt direkt LVL2.png ins Fenster

    Fenster()
    Gothicforum ist offline Geändert von Gothicforum (03.11.2020 um 00:33 Uhr)

  2. #2 Zitieren
    Legende Avatar von jabu
    Registriert seit
    Jul 2011
    Beiträge
    7.328
    Wenn du unter Python innerhalb einer Funktion einer globalen Variable einen Wert zuweisen willst, dann musst du sie zuvor (im gültigen Scope) als global deklarieren:
    Code:
    Hintergrundbild = 1
    
    def Knopfdruck1():
        global Hintergrundbild
        Hintergrundbild += 1
    Das ist nötig, weil unter Python Zuweisungen per = wie Definitionen aussehen und weil lokale Variablen globale verdecken, wobei aus Konsistenzgründen im Umkehrschluss bei += ebenfalls eine vorausgegangene lokale Definition erwartet wird (woraus deine Fehlermeldung resultierte). Mit der Deklaration als global ist festgelegt, dass die Definition bereits woanders, nämlich im globalen Scope, erfolgt ist, sodass eine folgende Zuweisung eines Wertes an eine Variable wirklich eine Zuweisung (und keine Definition (einer neuen, lokalen, Variable)) ist.

    Definition der lokalen Variable x:
    Code:
    def foo():
        x = 1
    Zuweisung an die globale Variable x:
    Code:
    x = 0
    
    def foo():
        global x
        x = 1
    Ohne global x würde es sich bei x = 1 um die Definition einer neuen, lokalen, Variable mit dem Namen x handeln, wodurch die globale Variable x unverändert bliebe. Die lokale Variable würde die globale verdecken.

    Ich hoffe, dass das schon hilft. Speziell mit diesem GUI-Framework (Tk) kenne ich mich leider kaum aus (Fragen kostet trotzdem nichts).
    jabu ist offline Geändert von jabu (03.11.2020 um 16:11 Uhr)

  3. #3 Zitieren
    Veteran
    Registriert seit
    Jun 2012
    Beiträge
    630
    Achso! Das erklärt natürlich alles! Danke sehr.



    Nochwas, was sich grad ergibt: Was, wenn die Button-Funktion eine lokale Variable der Fenster-Funtion ändern soll. Geht das?

    (denn Folgendes ist der Fall: mit dem `als global deklarieren` hat es jetzt geklappt, dass die Variabel durch den Buttonclick geändert wird. Die Variable hat einen neuen Wert, der auch ausgegeben wird mit "print", aber das Fenster wird nicht geupdatet mit dem erhofften, neuen Hintergrund.
    Also müsste der Buttonclick sowas aufrufen wie "fenster.update()" oder so. Aber fenster ist eine lokale Variable der Fenster-Funktion)
    Gothicforum ist offline

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •