Seite 1 von 1

Probleme beim Einlesen in Variablen

Verfasst: Freitag 16. Juli 2021, 00:22
von cyrus_1402
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()

Re: Probleme beim Einlesen in Variablen

Verfasst: Freitag 16. Juli 2021, 07:19
von __deets__
Gerade vor 2 Tagen hier diskutiert: viewtopic.php?t=38398

Re: Probleme beim Einlesen in Variablen

Verfasst: Freitag 16. Juli 2021, 09:32
von cyrus_1402
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

Re: Probleme beim Einlesen in Variablen

Verfasst: Freitag 16. Juli 2021, 09:45
von Sirius3
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()

Re: Probleme beim Einlesen in Variablen

Verfasst: Freitag 16. Juli 2021, 14:07
von cyrus_1402
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.

Re: Probleme beim Einlesen in Variablen

Verfasst: Freitag 16. Juli 2021, 19:25
von cyrus_1402
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.

Re: Probleme beim Einlesen in Variablen

Verfasst: Samstag 17. Juli 2021, 11:53
von Sirius3
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"