Ich habe einen Bug in tkinter?
Hallo, ich habe einen Code geschrieben welcher nicht ganz das macht was er soll. Ich arbeite hier mit tkinter, für die grafische Darstellung. Durch ein wenig troubleshoot scheint es mir so als wenn mein Button direkt beim Start des Programms ausgeführt wird, und nicht erst beim drücken, weil in der Konsole steht: ".!frame.!entry". Dies aber auch nur wenn ich print(eingabe1) anstatt print(zahl1) eingebe. Sonst passiert nichts wenn ich den Button drücke. Ich will eigentlich ein Programm schreiben was zwei Zahlen addiert aber das funktioniert sowieso nicht, aber das sollte
auch in def Addition stehen. Wüsste jemand wo da das Problem liegt?
1 Antwort
In Zeile 29 rufst du die Methode Addition auf. Sie wird ausgeführt, die Konsoleneingabe getätigt und der Wert None (= Standardrückgabewert von Funktionen) zurückgegeben. Letzerer wird an das command-Attribut überreicht. Bei Klick auf deinen Button wird also nichts passieren.
Richtig wäre diese Lösung:
button["command"] = lambda: button.Addition(eingabe1, eingabe2, ausgabe)
Das command-Attribut erwartet eine Referenz auf eine parameterlose Funktion. Da deine Funktion allerdings Argumente erfordert, wäre es sinnvoll, einen Lambda-Ausdruck einzusetzen. Dies ist im Prinzip eine anonyme Funktion, die deinen Aufruf kapselt.
Wieso du für all das allerdings eine extra Klasse brauchst und Anwendungs- mit UI-Logik verbindest, kann ich nicht so wirklich nachvollziehen. Ich würde dann doch eher eine Klasse Calculator anlegen (gib Bezeichnern grundsätzlich möglichst passende Namen, damit sofort ersichtlich wird, welchem Zweck sie dienen sollen), die Funktionen für Rechenoperationen implementiert. Die können dann in Event-Handlern für verschiedene Buttons (so viel, wie man halt benötigt) aufgerufen werden.
Die Vorteile bei einer klaren Trennung zwischen Model (Berechnungen) und View (Beschreibung der grafischen Oberfläche) liegt darin, dass Code besser lesbar wird, man ihn gut testen kann (ohne dafür ein komplettes Fenster anlegen zu müssen) und eine Wiederverwendbarkeit gewährleistet ist (wenn dein Programm noch einmal woanders addieren soll, braucht es dafür keinen Button). Schau dir das MVC-Pattern dazu an.
Danke dir für die aufschlussreiche Antwort! Ich werde mich darum kümmern. :)