Probleme beim Einlesen in Variablen

Fragen zu Tkinter.
Antworten
cyrus_1402
User
Beiträge: 4
Registriert: Freitag 16. Juli 2021, 00:03

Schreibe hier gerade ein Programm zum berechnen von Tonarmresonanzen bei Plattenspielern.

Es scheint wohl Probleme bei der Funktion get() zu geben. Folgende Fehlermeldung wird ausgespuckt:

m1 = float(ein1.get()) # Masse Tonarm in Gramm
AttributeError: 'NoneType' object has no attribute 'get'


Die Formel zur Berechnung funktioniert. Und wenn ich den Variablen Zahlen zuweise wird das Ergebnis auch richtig ausgegeben.
Das Einlesen der Eingaben funktioniert aber leider nicht.

Hiermal der Code:

Code: Alles auswählen

import math

import tkinter as tk

root = tk.Tk()
root.title("Tonarmresonanz-Rechner")
root.geometry("350x200+100+100") # Größe und Position des Hauptfensters

def button_calc_click():        # übernahme Werte aus entry + berechnen + Ausgabe
    m1 = float(ein1.get())           # Masse Tonarm in Gramm
    m2 = float(ein2.get())           # Masse Tonabnehmer in Gramm
    c = float(ein3.get())            # Nadelnachgibigkeit in mm/N
    Fres = (1000/(2*math.pi*math.sqrt((m1+m2)*c))) # Tonarmresonanz in Hz
    Fres = round(Fres,2)
    print(Fres, "Hz") # nur zum Testen, soll dann in lab_result ausgegeben werden 

# ------------------------------------------------------------------------------------------------

lab1 = tk.Label(root, text="Masse Tonarm in Gramm:", bg="#F781F3").grid(row=0, sticky="w")
lab2 = tk.Label(root, text="Masse Tonabnehmer in Gramm:", bg="#F781F3").grid(row=1, sticky="w")
lab3 = tk.Label(root, text="Nadelnachgibigkeit in mm/N:", bg="#F781F3").grid(row=2, sticky="w")
lab_result = tk.Label(root, text="result", width=10, bg="#F2F5A9").grid(row=3, column=1, sticky="w") # Hier Ergebnis auf Label ausgeben

ein1 = tk.Entry(root, width=10).grid(row=0, column=1)
ein2 = tk.Entry(root, width=10).grid(row=1, column=1)
ein3 = tk.Entry(root, width=10).grid(row=2, column=1)

button_calc = tk.Button(root, text="Berechnen", bg="#A9F5BC", command=button_calc_click).grid(row=3, sticky="e")

root.mainloop()
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Gerade vor 2 Tagen hier diskutiert: viewtopic.php?t=38398
cyrus_1402
User
Beiträge: 4
Registriert: Freitag 16. Juli 2021, 00:03

Danke. Aber davon kann ich leider nicht wirklich auf mein Problem schließen. Bin noch relativ neu was Python (Bzw. Programmieren im Allgemeinen angeht). Mache das erst seit einer Woche :D
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Der Rückgabewert des letzten Methodenaufrufs wird in die Variable gebunden, nicht des ersten, was eigentlich logisch ist, wird oft bei GUIs vergessen.
Hier der Rückgabewert von grid (welcher None ist) und nicht von tk.Entry.

Allgemein gilt, dass man keine globalen Variablen benutzen sollte, dass alles was eine Funktion braucht, sie über ihre Argumente bekommen muß.
Variablennamen sollten aussagekräftig sein, ein 1, 2 oder 3 an einem `ein` ist das nicht. Benutze auch keine Abkürzungen, weil die nur das Lesen zum Rätseln machen.
Werte werden erst bei der Ausgabe per Formatierungsangabe gerundet.

Werte, die man später nicht mehr braucht, wie die Labels, braucht man auch nicht an Variablen zu binden.

Code: Alles auswählen

import math
import tkinter as tk
from functools import partial

def button_calc_click(eingabe_masse_tonarm, eingabe_masse_tonabnehmer, eingabe_nadelnachgibigkeit):
    masse_tonarm = float(eingabe_masse_tonarm.get())           # Masse Tonarm in Gramm
    masse_tonabnehmer = float(eingabe_masse_tonabnehmer.get())           # Masse Tonabnehmer in Gramm
    c = float(eingabe_nadelnachgibigkeit.get())            # Nadelnachgibigkeit in mm/N
    tonarmresonanz = 1000 / (2 * math.pi * ((masse_tonarm + masse_tonabnehmer)*c) ** 0.5) # Tonarmresonanz in Hz
    print(f"Tonarmresonanz: {tonarmresonanz:.2f}Hz")

def main():
    root = tk.Tk()
    root.title("Tonarmresonanz-Rechner")
    root.geometry("350x200+100+100") # Größe und Position des Hauptfensters

    tk.Label(root, text="Masse Tonarm in Gramm:", bg="#F781F3").grid(row=0, sticky="w")
    eingabe_masse_tonarm = tk.Entry(root, width=10)
    eingabe_masse_tonarm.grid(row=0, column=1)

    tk.Label(root, text="Masse Tonabnehmer in Gramm:", bg="#F781F3").grid(row=1, sticky="w")
    eingabe_masse_tonabnehmer = tk.Entry(root, width=10)
    eingabe_masse_tonabnehmer.grid(row=1, column=1)

    tk.Label(root, text="Nadelnachgibigkeit in mm/N:", bg="#F781F3").grid(row=2, sticky="w")
    eingabe_nadelnachgibigkeit = tk.Entry(root, width=10)
    eingabe_nadelnachgibigkeit.grid(row=2, column=1)
    
    label_result = tk.Label(root, text="result", width=10, bg="#F2F5A9")
    label_result.grid(row=3, column=1, sticky="w") # Hier Ergebnis auf Label ausgeben

    tk.Button(root, text="Berechnen", bg="#A9F5BC",
        command=partial(button_calc_click, eingabe_masse_tonarm, eingabe_masse_tonabnehmer, eingabe_nadelnachgibigkeit)
    ).grid(row=3, sticky="e")
    root.mainloop()

if __name__ == "__main__":
    main()
cyrus_1402
User
Beiträge: 4
Registriert: Freitag 16. Juli 2021, 00:03

Vielen Dank. Das hat mir sehr geholfen. Ein paar Punkte verstehe ich allerdings nicht:

- from functools import partial

- print(f"Tonarmresonanz: {tonarmresonanz:.2f}Hz")

- if __name__ == "__main__":
main()

Aber da kann ich mich mal durchgoogeln.
Mercy erstmal.
cyrus_1402
User
Beiträge: 4
Registriert: Freitag 16. Juli 2021, 00:03

Jetzt fehlt mir noch eins:

Das Ergebnis von tonarmresonanz hätte ich ich gerne auf dem label label_result ausgegeben
Habe da schon ganz viele Variationen versucht. Ich bekomme es aber nicht hin.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Und welche Variationen waren das?
Als erstes braucht die Funktion label_result als weiteres Argument. Und dann einfach statt print

Code: Alles auswählen

label_result["text"] = f"Tonarmresonanz: {tonarmresonanz:.2f}Hz"
Antworten