Seite 1 von 1

Weiterberechnung einer Variable

Verfasst: Dienstag 26. September 2023, 20:38
von tchaluppa
Hallo,

ich habe mal wieder ein simples Anfängerproblem.

Hier erstmal ein wenig Code:

Code: Alles auswählen

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

zahl = 1

def berechnen(x):
    x = x + 1
    zahl = x
    print(zahl)

def main():
    root = tk.Tk()
    root.geometry("300x200")

    func = lambda:berechnen(zahl)
    nextbutton = tk.Button(root, text="Berechnen", command=func)
    nextbutton.grid(row=0, column=0)
    
    root.mainloop()

if __name__ == "__main__":
    main()
Als print Ausgabe bekomme ich allerdings immer die 2. Die Variable zahl wird quasi nicht weitergezählt.
Wo liegt hier bitte der Fehler?

Vielen Dank schon mal.

Re: Weiterberechnung einer Variable

Verfasst: Dienstag 26. September 2023, 20:50
von __blackjack__
@tchaluppa: Da gibt's nicht *den* Fehler. Das sieht aus als wären da gleich mehrere falsche Annahmen gemacht worden.

Für GUI-Programmierung muss man mit Funktionen umgehen können. Also nicht mehr irgendwas ausserhalb der Funktion verändern wollen, Das sind die Grundlagen für Klassen. Und objektorientierte Programmierung (OOP), also Klassen, braucht man für jedes nicht-triviale GUI-Programm.

`zahl` hat auf Modulebene nichts zu suchen. Da steht nur Code der Konstanten, Funktionen, und Klassen definiert. Funktionen und Methoden bekommen alles was sie ausser Konstanten benötigen, als Argument(e) übergeben.

``lambda``-Ausdrücke sind für anonyme Funktionen, also solche die keinen Namen haben. Es macht deshalb nicht so viel Sinn die anonyme Funktion erst an einen, dazu noch völlig nichtssagenden, Namen zu binden. Dann hätte man auch einfach ``def`` verwenden können und hätte bei Fehlern einen sinnvollen Funktionsnamen im Traceback stehen.

Re: Weiterberechnung einer Variable

Verfasst: Dienstag 26. September 2023, 22:52
von Sirius3
Das ist kein simples Anfängerproblem, weil man für die Lösung einiges an Wissen braucht. Für GUIs muß man Klasse implementieren können, denn nur so läßt sich der Zustand (der Wert der Zahl) über das Ende der Funktion hinaus speichern.

Code: Alles auswählen

import tkinter as tk

class App(tk.Tk):
    def __init__(self):
        super().__init__()
        self.zahl = 1
        tk.Button(self, text="Berechen", command=self.berechnen).pack()
        self.output = tk.Label(self, text=self.zahl)
        self.output.pack()
    
    def berechnen(self):
        self.zahl += 1
        self.output['text'] = self.zahl

def main():
    root = App()
    root.mainloop()

if __name__ == "__main__":
    main()

Re: Weiterberechnung einer Variable

Verfasst: Mittwoch 27. September 2023, 10:12
von tchaluppa
Vielen Dank an euch beide.

Da werde ich mich mal mit dem Thema Klassen auseinandersetzen.

Grüße