Temperaturumrechnung mit tkinter

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Mitch_92
User
Beiträge: 3
Registriert: Freitag 10. Juli 2020, 12:35

Guten Abend,

ich habe kürzlich "gezwungenermaßen" (war eine Hausaufgabe für die Uni) eine Anwendung zur Temperaturumrechnung in verschiedene Einheiten geschrieben.
Das ganze war als Einführungsaufgabe in tkinter gedacht, aber ich werde nicht wirklich warm damit.
Wenn ich das ausführe, bekomme ich keine Fehlermeldung und kann die entsprechenden Felder auch füllen, allerdings passiert danach einfach nichts mehr. Ich bin mir nicht mal sicher, ob es "nur" an der Ausgabe der berechneten Temperatur hängt oder ob die Berechnung gar nicht erst startet... Mag mir jemand mal auf die Sprünge helfen, wo da mein Denkfehler ist?
Ach so, falls jemand allgemein noch Kritik an meiner Lösung üben möchte, immer her damit. Ich habe das Gefühl, dass das viel zu "aufgebläht" ist :?

Code: Alles auswählen

import tkinter

window = tkinter.Tk()

# Abfrage, Eingabe und Auslesen der Urpsungseinheit
original_label = tkinter.Label(window, text='Bitte geben Sie die Ursprungseinheit an. Moeglichkeiten: C, F, K')
original_label.pack()
original_input = tkinter.Entry(window)
original_input.pack()


# Abfrage, Eingabe und Auslesen der Ursprungtemperatur
temperature_label = tkinter.Label(window, text='Bitte geben Sie die Temperatur an')
temperature_label.pack()
temperature_input = tkinter.Entry(window)
temperature_input.pack()


# Abfrage, Eingabe und Auslesen der Umrechnungseinheit
conversion_label = tkinter.Label(window, text='In welche Einheit moechten Sie umrechnen?')
conversion_label.pack()
conversion_input = tkinter.Entry(window)
conversion_input.pack()

# Ausgabe der umgerechneten Temperatur
converted_label = tkinter.Label(window, text='')  #Text nicht relevant
converted_label.pack()


def temperature_conversion():
    # Datenuebernahme
    original_unit = original_input.get()
    original_temperature = temperature_input.get()
    conversion_unit = conversion_input.get()
    conversion_temperature = 'Berechnung folgt'
    # Berechnung
    if original_unit == 'C' and conversion_unit == 'F':
        conversion_temperature = str(original_temperature*9/5+32)
    if original_unit == 'C' and conversion_unit == 'K':
        conversion_temperature = str(original_temperature+273.15)
    if original_unit == 'F' and conversion_unit == 'C':
        conversion_temperature = str((original_temperature-32)*9/5)
    if original_unit == 'F' and conversion_unit == 'K':
        conversion_temperature = str((original_temperature-32)*9/5+273.15)
    if original_unit == 'K' and conversion_unit == 'C':
        conversion_temperature = str(original_temperature-273.15)
    if original_unit == 'K' and conversion_unit == 'F':
        conversion_temperature = str((original_temperature-273.15)*9/5+32)
    converted_label.config(text=conversion_temperature)


# Umrechung der Temperatur
convert_button = tkinter.Button(window, text='Berechnen', command=temperature_conversion())
convert_button.pack()


window.mainloop()
Benutzeravatar
__blackjack__
User
Beiträge: 14013
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Mitch_92: Wenn Du nicht sicher bist was wann ausgeführt wird, oder auch nicht ausgeführt wird, dann helfen in der Regel strategisch platzierte `print()`- oder Logging-Ausgaben auf der Konsole um da Gewissheit zu schaffen.

Einfach mal an den Anfang von `temperature_conversion()` und Du wirst sehen die Funktion wird ausgeführt. Wirst aber vielleicht überrascht sein *wann* die ausgeführt wird. Typischer Anfängerfehler: das `commad`-Argument von `Button` erwartet eine Funktion oder Methode als Argument. Du übergibst da etwas anderes. Du übergibst nicht die Funktion, sondern Du rufst die Funktion auf und übergibst deren Rückgabwert. Der ist `None` und das macht als `command` keinen Sinn, denn `None` ist nicht aufrufbar.

Allgemein: Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

Funktionen und Methoden bekommen alles was sie ausser Konstanten benötigen als Argument(e) übergeben. `temperature_conversion()` braucht so einiges als Argumente. Das kann man mittels `functools.partial()` lösen, aber eigentlich braucht man für jede nicht-triviale GUI objektorientierte Programmierung (OOP).

Für die Auswahl der Einheiten würde ich keine Freitextfelder verwenden, denn man muss Benutzereingaben immer prüfen. Die Leute geben die unmöglichsten Sachen ein. Wenn man da Radiobuttons oder ein `OptionMenu` jeweils für Quell- und Zieleinheit verwendet, kann der Benutzer da schon mal nicht ”Milliampere” eingeben. Den Zahlenwert müsste man dann schon noch prüfen ob das was der Benutzer da eingegeben hat, tatsächlich eine Zahl ist.

Die Umrechnung könnte man in zwei Schritten machen um die Anzahl der Formeln übersichtlicher zu halten. Wenn man pro Einheit eine Funktion von der Einheit nach Kelvin und von Kelvin in die Einheit hat, kann man Einheiten hinzufügen ohne das man für jede Einheit eine Umrechnungsformel in jede andere Einheit braucht.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Antworten