Labels und Entrys mit Schleifen + Tasten binden in tkinter

Fragen zu Tkinter.
Antworten
KevKev
User
Beiträge: 5
Registriert: Montag 18. Februar 2019, 17:45

Hallo zusammen

Ich bin neu hier in diesem Forum und hoffe ich habe mein anliegen im richtigen Bereich platziert.
Für mein Problem habe ich viel gegoogelt leider hat es mir nichts gebracht. Hoffe Ihr könnt mir weiter helfen

Ich habe folgendes Programm zur Berechnung der Dichtehöhe geschrieben, dies Funktioniert so auch, ist einfach nicht schön und ich möchte es verbessern:

Code: Alles auswählen

import tkinter

root = tkinter.Tk()
root.title("Density altitude calculator")
root.geometry("500x275")

def calculateda():
    ad_elev = float(airp_elev.get())
    pres = float(QNH.get())
    temp = float(OAT.get())
   
    QNE = 1013
    isa_st = 15

    ad = ((QNE - pres) * 28)
    pa = ad_elev + ad

    st_pa = round(isa_st - (pa / 1000 * 2),2)

    hd = 120 * (temp - st_pa)
    da = round(pa + hd)
    
    labelresult = tkinter.Label(root, text = "The density altitude is: %.d ft" % da).grid(row = 7, column = 1, padx = 10, pady = 10)
    return

L0 = tkinter.Label(root, text = "Welcome to the density altutude calculator!", fg = "red").grid(row = 0, column = 1, sticky = "W", padx = 10, pady = 10)
L1 = tkinter.Label(root, text = "Airport elevation [ft]").grid(row = 1, column = 0, sticky = "W", padx = 10, pady = 10)
L2 = tkinter.Label(root, text = "QNH [hPa]").grid(row = 2, column = 0, sticky = "W", padx = 10, pady = 10)
L3 = tkinter.Label(root, text = "Ourside air temperature [°C]").grid(row = 3, column = 0, sticky = "W", padx = 10, pady = 10)

airp_elev = tkinter.StringVar()
QNH = tkinter.StringVar()
OAT = tkinter.StringVar()

E1 = tkinter.Entry(root, textvariable = airp_elev, bd = 5).grid(row = 1, column = 1)
E2 = tkinter.Entry(root, textvariable = QNH, bd = 5).grid(row = 2, column = 1)
E3 = tkinter.Entry(root, textvariable = OAT, bd = 5).grid(row = 3, column = 1)

b1 = tkinter.Button(root, text = "Calculate density altitude", command = calculateda).grid(row = 4, column = 1, padx = 10, pady = 10)

root.bind("<Return>", calculateda)

root.mainloop()
Ich wollte die Labels mittels dict und for Schleife schöner Programmieren:
Vorher:

Code: Alles auswählen

L0 = tkinter.Label(root, text = "Welcome to the density altutude calculator!", fg = "red").grid(row = 0, column = 1, sticky = "W", padx = 10, pady = 10)
L1 = tkinter.Label(root, text = "Airport elevation [ft]").grid(row = 1, column = 0, sticky = "W", padx = 10, pady = 10)
L2 = tkinter.Label(root, text = "QNH [hPa]").grid(row = 2, column = 0, sticky = "W", padx = 10, pady = 10)
L3 = tkinter.Label(root, text = "Ourside air temperature [°C]").grid(row = 3, column = 0, sticky = "W", padx = 10, pady = 10)
Nachher:

Code: Alles auswählen

labels = {"Airport elevation [ft]", "QNH [hPa]", "Outside air temperature [°C]"}

for i in labels:
    l = tkinter.Label(root, text = i + 1)
    l.grid(row = i + 1, column = 0, sticky = "W", padx = 10, pady = 10)
Die Entrys wollte ich mittels Liste und for Schleife schöner Programmieren:
Vorher:

Code: Alles auswählen

airp_elev = tkinter.StringVar()
QNH = tkinter.StringVar()
OAT = tkinter.StringVar()

E1 = tkinter.Entry(root, textvariable = airp_elev, bd = 5).grid(row = 1, column = 1)
E2 = tkinter.Entry(root, textvariable = QNH, bd = 5).grid(row = 2, column = 1)
E3 = tkinter.Entry(root, textvariable = OAT, bd = 5).grid(row = 3, column = 1)
Nachher:

Code: Alles auswählen

entrys = tkinter.StringVar([airp_elev, QNH, OAT])

for e in entrys:
    e = tkinter.Entry(root, textvariable = e + 1, bd = 5)
    e.grid(row = e + 1, column = 1)
Und den Button b1 wollte ich wie folgt an die Entertaste binden:

Code: Alles auswählen

b1 = tkinter.Button(root, text = "Calculate density altitude", command = calculateda).grid(row = 4, column = 1, padx = 10, pady = 10)

b1.bind("<Return>", calculateda)
Nun ist es leider so, dass keine meiner "Verbesserungen resp. verschönerungen" funktioniert haben. Könntet Ihr mir sagen was ich falsch mache? Überlegungsfehler oder so? Stehe echt auf dem Schlauch.
Falls Ihr sonst noch verbesserungspotential seht wäre ich euch sehr dankbar für eure Hilfe.

Besten Dank schon jetzt für eure Hilfe.

Liebe Grüsse
Kevin
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Was ist der Sinn davon, None an alle möglichen Variablen zu binden? L1-4 und E1-4 sind allesamt überflüssig. Sets sind wohl der falsche Datentyp.
Was bedeutet `funktioniert nicht`? Was passiert denn und was erwartest Du?

Als erste Verbesserung solltest Du all die globalen Variablen loswerden. `round` ist unnötig, da man bei der Ausgabe erst runden sollte, da ist aber %.d eine komische Formatangabe.
KevKev
User
Beiträge: 5
Registriert: Montag 18. Februar 2019, 17:45

Es erscheint folgende Fehlermeldung, aus welcher ich nicht schlau werde:

Code: Alles auswählen

runfile('C:/Users/###/Desktop/density_altitude.py', wdir='C:/Users/###t/Desktop')
Traceback (most recent call last):

  File "<ipython-input-1-2dc5be3aadfe>", line 1, in <module>
    runfile('C:/Users/###/Desktop/density_altitude.py', wdir='C:/Users/###/Desktop')

  File "C:\Users\###\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 786, in runfile
    execfile(filename, namespace)

  File "C:\Users\###\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 110, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "C:/Users/###/Desktop/density_altitude.py", line 36, in <module>
    l = tkinter.Label(root, text = i + 1)

TypeError: can only concatenate str (not "int") to str
Meine Erwartung:
Das ein Fenster mit Eingabefeldern aufgeht. In die Eingabefelder kann ich variable Zahlen eingeben und mit dem Drücken auf den Knopf wird mittels der funktion calculateda die Dichtehöhe berechnet.
Den Knopf möchte ich mit der Entertaste verbinden, damit ich den Knopf nicht immer mit der Maus bedienen muss, sondern die Entertaste drücken kann und somit die Akton ausgeführt wird.

Die globalen Variabeln (L0-3) und (E1-3) möchte ich ja "eliminieren" mittels for-Schleifen und dict sowie Listen. Leider bekomme ich das so nicht hin. Ist dies der falsche Ansatz? Wenn ja wie würde es besser oder richtig gehen?

LG Kevin
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Was erwartst Du, was "QNH [hPa]" + 1 ergibt?

Da Du die Variablen nicht benutzt und sie sowieso nur None enthalten, kannst Du sie einfach weglassen.

Wenn Du etwas in eine Schleife packen willst, dann macht es nur sinn StringVar, Label und Entry in einem Gang zu erzeugen.
Antworten