Multiplikation zweier Eingaben

Fragen zu Tkinter.
Antworten
WilhelmDerKaiser
User
Beiträge: 1
Registriert: Freitag 18. Dezember 2020, 14:12

Hallo zusammen, ich habe versucht, diesen Rechner für Flächeninhalt zu programmieren. Eingabe etc passt alles, leider kommen bei mir zwei Fehlermeldungen, welche ich noch nicht ganz zuordnen kann. Habe jetzt mehreres probiert, aber scheint alles nicht zu funktionieren.

Hier die Fehlermeldung

Exception in Tkinter callback
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/tkinter/__init__.py", line 1885, in __call__
return self.func(*args)
File "/Users/Elmar/Library/Mobile Documents/com~apple~CloudDocs/Studium/Semester 3/Programmieren/Ausführungen/Eigenes/Flaecheninhalt(GUI).py", line 14, in flaeche
result.config(summe)
AttributeError: 'NoneType' object has no attribute 'config'

Hier einmal mein Code

from tkinter import *
ansicht = Tk()
ansicht.title("Flächeninhalt berechnen")
ansicht.geometry("500x300")
#Anweisung
Label0 = Label(text = "Berechnung des Flächeninhalts eines Vierecks",fg = "red", font = ("arial",20,"bold", "italic")).pack()

#Funktion
def flaeche(*self):
a = float(eingabe1.get())
b = float(eingabe2.get())
summe = a * b
print(summe)
result.config(summe)




#Eingabefelder
#Eingabe für a
label1 = Label(text = "Länge Seite A").pack()
eingabe1 = Entry(ansicht,)
eingabe1.bind("<Return>", flaeche)
eingabe1.pack()
#Eingabe für b
label2 = Label(text = "Länge Seite B").pack()
eingabe2 = Entry(ansicht,)
eingabe2.bind("<Return>", flaeche)
eingabe2.pack()


#Button zur Berechnung
berechnen = Button(ansicht, text = "Berechnen",bg = "green", font = ("arial","16", "bold", "italic"), command = flaeche).pack()


#Ausgabe - Ergebnis
result = StringVar()

result = Label(ansicht, width = "30",fg = "black", bg = "yellow").pack()







ansicht.mainloop()
Sirius3
User
Beiträge: 18289
Registriert: Sonntag 21. Oktober 2012, 17:20

Benutze keine *-Importe, das schaufelt Dir unkontrolliert hunderte Namen in den eigenen Namensraum, so dass nicht mehr nachvollziehbar ist, woher was kommt.
Man muß nicht alles an Variablennamen binden, wenn man das später gar nicht mehr braucht. Vor allem macht es wenig Sinn, None auf so komplizierte Weise zuzuweisen; der Rückgabewert von pack ist nämlich None.

Bei den Labels fehlt `ansicht`.
Die Funktion Fläche hat ein komisches Argument *self, das gar nicht benutzt wird. Aber alles was eine Funktion braucht, muß sie über ihre Argumente bekommen, also `eingabe1`, `eingabe2` und `result`.
Bei `result.config` fehlt die Eigenschaft, die gesetzt werden soll.

Alles auf oberster Ebene muß auch in eine Funktion, die man üblicherweise main nennt. Dann läuft man auch nicht Gefahr, globale Variablen zu benutzen.

Was soll das StringVar?

Code: Alles auswählen

import tkinter as tk
from functools import partial

def flaeche(eingabe1, eingabe2, result, *_event):
    a = float(eingabe1.get())
    b = float(eingabe2.get())
    summe = a * b
    print(summe)
    result.configure(text=summe)

def main():
    ansicht = tk.Tk()
    ansicht.title("Flächeninhalt berechnen")
    ansicht.geometry("500x300")
    tk.Label(ansicht, text="Berechnung des Flächeninhalts eines Vierecks", fg="red", font=("arial",20,"bold", "italic")).pack()
    tk.Label(ansicht, text="Länge Seite A").pack()
    eingabe1 = tk.Entry(ansicht)
    eingabe1.pack()
    tk.Label(ansicht, text="Länge Seite B").pack()
    eingabe2 = tk.Entry(ansicht)
    eingabe2.pack()
    result = tk.Label(ansicht, width="30", fg="black", bg="yellow")
    call_flaeche = partial(flaeche, eingabe1, eingabe2, result)
    tk.Button(ansicht, text="Berechnen", bg="green", font=("arial","16", "bold", "italic"), command=call_flaeche).pack()
    eingabe1.bind("<Return>", call_flaeche)
    eingabe2.bind("<Return>", call_flaeche)
    result.pack()
    ansicht.mainloop()
    
if __name__ == '__main__':
    main()
Antworten