Home > OS >  Values not stored in Tkinter Variables
Values not stored in Tkinter Variables

Time:04-04

In my code, I have tried to get the user input through text fields, store them in variables and finally print them in a tabular form. The problem I am facing is that none of the values I enter through the text fields get displayed; when I try printing the variables, they come up empty. Here's part of my code:

# SPASC

from tkinter import *
import tkinter as tk
import tkinter.ttk as tktrv

root = tk.Tk()
root.title("SPASC")
root.geometry("410x400")
lb1 = Label(root, text="SPASC \n Welcomes You !!!", fg="red", bg="sky blue"
        , font=('Arial Black', 20), width=22, anchor=CENTER)
lb2 = Label(root, text="What would you like to compare?",
        font=('Arial', 18), anchor=CENTER)
space1 = Label(root, text="\n\n")
lb1.grid(row=0)
lb2.grid(row=5)
space1.grid(row=1)
hpw, mil = StringVar(), StringVar()

def bt_cars():
   w1 = Toplevel()
   w1.title("Choose Features")
   w1.geometry("430x200")

   lb3 = Label(w1, text="Choose features for comparison", bg="yellow"
            , font=('Arial Black', 18), width=25)
   lb4 = Label(w1, text=" ", anchor=CENTER)
   fr1 = LabelFrame(w1, width=20, padx=100)
   hpw_cb = Checkbutton(fr1, text="Horsepower", variable=hpw, anchor='w', onvalue="Horsepower", offvalue="")
   hpw_cb.grid()
   hpw_cb.deselect()
   mil_cb = Checkbutton(fr1, text="Mileage", variable=mil, anchor='w', onvalue="Mileage", offvalue="")
   mil_cb.grid()
   mil_cb.deselect()
   var_stor = [hpw, mil]
   print(hpw)
   print(mil)
   var_fill = []
   for itr1 in var_stor:
       if itr1 != "":
           var_fill.append(itr1)
   print(var_fill)
   def car_1():
       name1 = StringVar()
       c1 = Toplevel()
       c1.title("Car 1")
       c1.geometry("430x200")
       car1_lb1 = Label(c1, text="Car Name:")
       name1_ifl = Entry(c1)
       name1 = name1_ifl.get()

       elm_var_fill = len(var_fill)
       ct1 = 0
       car1_val = []
       for itr2 in var_fill:
           if ct1 == elm_var_fill:
              break
           lb5 = Label(c1, text=itr2.get())
           #Creating text field
           ftr1_ifl = Entry(c1)
           car1_ftr = ftr1_ifl.get()
           car1_val.append(car1_ftr)
           car1_ftr = None
           lb5.grid(row=ct1   2, column=1)
           ftr1_ifl.grid(row=ct1   2, column=2)
           ct1  = 1
       print(car1_val)

       def display():
           dp = Toplevel()
           dp.title("Results")
           dp.geometry("500x200")
           car1_pt = 0
           car2_pt = 0
           car_tree = tktrv.Treeview(dp)
           car_tree["columns"] = ("car1col")
           car_tree.column("#0", width=120, minwidth=30)
           car_tree.column("car1col", width=120, minwidth=30)
           car_tree.heading("#0", text="Features" )
           car_tree.heading("car1col", text=str(name1))
           car_tree.pack()
           c1.withdraw()
           print(var_fill)
      done1_bt = Button(c1, text="Continue", command=display)
      name1_ifl.grid(row=0, column=2)
      car1_lb1.grid(row=0, column=1)
      done1_bt.grid(row=5,column=1)
      w1.withdraw()

   done_bt = Button(w1, text="Done", command=car_1)
   done_bt.grid(row=3, column=1)
   lb3.grid(row=0, column=1)
   lb4.grid(row=1, column=1)
   fr1.grid(row=2, column=1)
   root.withdraw()

bt1 = Button(root, text="CARS", width=5, font=('Calibri', 15), command=bt_cars)
bt1.grid(row=7)
space2 = Label(root, text="\n\n")
space2.grid(row=6)
root.mainloop()

I am facing trouble with the variables named: hpw, mil, name1. Any help would be welcome.

NOTE:- Please excuse the amount of code; I wanted others to replicate the error and see it for themselves

CodePudding user response:

For the variables hpw and mil, these variables are empty strings that's why you are not getting any value from those checkboxes. To get values from the checkboxes replace these lines of code:

var_stor = [hpw, mil]

with

var_stor = [hpw_cb.cget('onvalue'), mil_cb.cget('onvalue')]

since you want the onvalue then you must use cget() method to access those values.

also, replace

lb5 = Label(c1, text=itr2.get())

with

lb5 = Label(c1, text=itr2)

because now you have required values (not objects) in a list, so just need to access those values.

For the variable name1 you can use @BokiX's method.

CodePudding user response:

The problem is you are using get() wrong. You cannot use get() right after Entry() because as soon as entry is created it's getting the input before the user can even input something.

Use this code:

def get_input(text):
  print(text)

e = Entry(root)
e.pack()
b = Button(root, text="Print input", command=lambda: get_input(e.get()))
b.pack()

Now get() method will not be executed before you click the button.

  • Related