未存储在 Tkinter 变量中的值

发布于 2025-01-18 14:07:08 字数 3316 浏览 2 评论 0原文

在我的代码中,我试图通过文本字段获得用户输入,将它们存储在变量中,最后以表格形式打印它们。 我面临的问题是,我没有通过文本字段输入的值都显示出来。当我尝试打印变量时,它们会空着。 这是我的代码的一部分:

# 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()

我在名为:HPW,MIL,NAME1的变量方面面临麻烦。 任何帮助将受到欢迎。

注: - 请原谅代码的金额;我希望其他人复制错误并亲自查看

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

半城柳色半声笛 2025-01-25 14:07:08

对于变量 hpwmil,这些变量是空字符串,这就是您无法从这些复选框中获取任何值的原因。要从复选框获取值,请将以下代码行替换为:

var_stor = [hpw, mil]

因为

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

您需要 onvalue 那么您必须使用 cget() 方法来访问这些值。

另外,替换

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

lb5 = Label(c1, text=itr2)

因为现在列表中有所需的值(而不是对象),所以只需要访问这些值。

对于变量 name1 您可以使用@BokiX 的方法。

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.

温柔少女心 2025-01-25 14:07:08

问题是您正在使用get()错误。您不能在entry> entry()之后立即使用get(),因为一旦创建了输入,就可以在用户甚至可以输入某些内容之前获取输入。

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.

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文