Weiterberechnung einer Variable

Fragen zu Tkinter.
Antworten
tchaluppa
User
Beiträge: 7
Registriert: Mittwoch 2. August 2023, 10:55

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.
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

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()
tchaluppa
User
Beiträge: 7
Registriert: Mittwoch 2. August 2023, 10:55

Vielen Dank an euch beide.

Da werde ich mich mal mit dem Thema Klassen auseinandersetzen.

Grüße
Antworten