之前我曾经问过这个问题 - 但我认为我的说法不正确。
我基本上想要下面的内容 - 虽然这根本不起作用 - 因为我显然不能在那里输入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())
我有很多,而且很麻烦。它似乎打印空白值和对变量的引用 - 而不是其中的值
答案 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_label
和firstname_field
始终为None
,因为这是grid
返回的内容。最好将小部件创建与布局分开。
此外,在大多数情况下,您并不需要StringVar(假设您正确存储了对窗口小部件的引用)。只需省略它,当你需要条目小部件的值时,你可以直接从条目小部件中获取它:
...
self.firstname_field = Entry(...)
...
print(self.firstname_field.get())
只有在想要在窗口小部件之间共享值,或者想要在变量上设置跟踪时,才需要使用StringVar。