StringVar.get()返回一个空值

时间:2014-05-14 18:34:42

标签: python-3.x user-interface tkinter tkinter-entry

之前我曾经问过这个问题 - 但我认为我的说法不正确。

  1. 我真正想要的是让用户填写一个tkinter输入框,并保存值 - 某处。
  2. 我想点击一个按钮,并让用户输入的文字进行操作。
  3. 我基本上想要下面的内容 - 虽然这根本不起作用 - 因为我显然不能在那里输入StringVar。我真的在我的智慧结束:(

    我怎样才能重写这个,所以它会起作用?

    class Driver():
        firstname = StringVar()
    
        def __init__(self):
            root = Tk()
            root.wm_title("Driver")
    
            firstname_label = ttk.Label(root, text="First Name *").grid(row=0, column=0)
            firstname_field = ttk.Entry(root, textvariable=self.firstname).grid(row=0, column=1)
    
            ttk.Button(root, text="Send", command=self.submit).grid()
            root.mainloop()
    
        def submit(self):
            print(self.firstname.get())
    

    我有很多,而且很麻烦。它似乎打印空白值和对变量的引用 - 而不是其中的值

1 个答案:

答案 0 :(得分:2)

您不能以这种方式使用StringVar - 在创建根窗口之前,不能创建StringVar。因为您在构造函数中创建了根窗口,所以代码会抛出错误。

解决方案是在构造函数中移动StringVar的创建:

类Driver():

def __init__(self):
    root = Tk()
    root.wm_title("Driver")

    self.firstname = StringVar()
    firstname_label = ttk.Label(root, text="First Name *").grid(row=0, column=0)

请注意,您编写代码的方式firstname_labelfirstname_field始终为None,因为这是grid返回的内容。最好将小部件创建与布局分开。

此外,在大多数情况下,您并不需要StringVar(假设您正确存储了对窗口小部件的引用)。只需省略它,当你需要条目小部件的值时,你可以直接从条目小部件中获取它:

...
self.firstname_field = Entry(...)
...
print(self.firstname_field.get())

只有在想要在窗口小部件之间共享值,或者想要在变量上设置跟踪时,才需要使用StringVar。