-1

I would like to code the following code in loops. Unfortunately my loops didn't work at all. Could anyone help me to get the StringVar, labels and entryboxes into a for or while loop?

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

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)

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)
jonrsharpe
  • 115,751
  • 26
  • 228
  • 437

3 Answers3

1

That's a handy function called enumerate which works particularly well when you want to grid a series of widgets. You can read it up here.

Since you are aligning your labels and entries side by side, you can actually do both in one go by utilizing zip and enumerate together in a for loop:

import tkinter

root = tkinter.Tk()

airp_elev = tkinter.StringVar()
QNH = tkinter.StringVar()
OAT = tkinter.StringVar()
all_labels = ("Airport elevation [ft]","QNH [hPa]","Ourside air temperature [°C]") #group your labels together
all_var = (airp_elev,QNH,OAT) #group your vars together

L0 = tkinter.Label(root, text = "Welcome to the density altutude calculator!", fg = "red").grid(row = 0, column = 1, sticky = "W", padx = 10, pady = 10)

for num,i in enumerate(zip(all_labels,all_var),1): #enumerate through both lists
    label, entry = i #unpack the tuple i into two easy to read variables
    tkinter.Label(root,text=label).grid(row=num,column=0,sticky = "W", padx = 10, pady = 10)
    tkinter.Entry(root, textvariable=entry, bd=5).grid(row=num, column=1)

tkinter.Button(root,text="Print result",command=lambda: print(airp_elev.get(),QNH.get(),OAT.get())).grid(row=4,column=0,columnspan=2)

root.mainloop()
Henry Yik
  • 22,275
  • 4
  • 18
  • 40
0

Here is a little example. Your problem may have to do with the need to separate the .grid (or pack whatever) method from widget creation otherwise you loose the reference to the widget.

import tkinter as tk
from tkinter import Tk

def print_myvars():
    for key in myvars:
        print(myvars[key].get())

root = Tk()

fields = ['One', 'Two', 'Three']
myvars = dict()
widgets = dict()

for field in fields:
    myvars[field] = tk.StringVar()
    widgets[field] = tk.Entry(
        root, text=field, textvariable=myvars[field])
    widgets[field].pack()

print_myvars_button = tk.Button(
    root, text='Print Vars', command=print_myvars)
print_myvars_button.pack()

root.mainloop()
progmatico
  • 4,714
  • 1
  • 16
  • 27
  • 1
    Your code has same issue of not separating `tk.Button(...)` and `pack()` on `print_myvars_button`. – acw1668 Feb 19 '19 at 00:38
  • @acw1668 you are right, silly me. Well that's not really an issue, you can do it if you don't need to keep the widget reference, which was the case but as an example was probably contradictory. Just edited, thanks. – progmatico Feb 19 '19 at 21:58
0

I wanted to show you my code. It's a density altitude calculator, density altitude calculation is mostly used in aviation.

    import tkinter

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

    airp_elev = tkinter.StringVar()
    QNH = tkinter.StringVar()
    OAT = tkinter.StringVar()
    all_labels = ("Airport elevation [ft]","QNH [hPa]","Ourside air temperature [°C]") #group your labels together
    all_var = (airp_elev,QNH,OAT) #group your vars together

    L0 = tkinter.Label(root, text = "Welcome to the density altutude calculator!", fg = "red").grid(row = 0, column = 1, sticky = "W", padx = 10, pady = 10)

    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 = isa_st - (pa / 1000 * 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 

    for num,i in enumerate(zip(all_labels, all_var),1): #enumerate through both lists
        label, entry = i #unpack the tuple i into two easy to read variables
        tkinter.Label(root, text = label).grid(row = num, column =0 , sticky = "W", padx = 10, pady = 10)
        tkinter.Entry(root, textvariable = entry, bd = 5).grid(row = num, column = 1)

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

   root.mainloop()

If one of you has any idea how to improve this code, please answer. Every comment is welcome.

Kind regards Kevin