I am having trouble setting a default value for a text entry widget in a Python 3.9 tkinter application.
I am using a StringVar as the text variable, and changing it using .set().
I am trying to pre-set the date (and time).
If I do it in a class, the box is empty, even though the value has been changed:
<code>class test:
def __init__(self, root):
# Content frame widget
mainframe = ttk.Frame(root, padding="3 3 12 12")
mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
ttk.Label(root, text="Date/Time").grid(
column=1, row=3, sticky=E, padx=(5, 0)
)
self.date_value = StringVar()
self.date_value.set(datetime.today().strftime("%Y-%m-%d"))
ttk.Entry(root, width=10, textvariable=self.date_value).grid(column=2, row=3, sticky=E)
print(self.date_value.get())
root = Tk()
test(root)
root.mainloop()
</code>
<code>class test:
def __init__(self, root):
# Content frame widget
mainframe = ttk.Frame(root, padding="3 3 12 12")
mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
ttk.Label(root, text="Date/Time").grid(
column=1, row=3, sticky=E, padx=(5, 0)
)
self.date_value = StringVar()
self.date_value.set(datetime.today().strftime("%Y-%m-%d"))
ttk.Entry(root, width=10, textvariable=self.date_value).grid(column=2, row=3, sticky=E)
print(self.date_value.get())
root = Tk()
test(root)
root.mainloop()
</code>
class test:
def __init__(self, root):
# Content frame widget
mainframe = ttk.Frame(root, padding="3 3 12 12")
mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
ttk.Label(root, text="Date/Time").grid(
column=1, row=3, sticky=E, padx=(5, 0)
)
self.date_value = StringVar()
self.date_value.set(datetime.today().strftime("%Y-%m-%d"))
ttk.Entry(root, width=10, textvariable=self.date_value).grid(column=2, row=3, sticky=E)
print(self.date_value.get())
root = Tk()
test(root)
root.mainloop()
If I do it outside the class it works.
<code>root = Tk()
mainframe = ttk.Frame(root, padding="3 3 12 12")
mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
ttk.Label(root, text="Date/Time").grid(
column=1, row=3, sticky=E, padx=(5, 0)
)
date_value = StringVar()
date_value.set(datetime.today().strftime("%Y-%m-%d"))
ttk.Entry(root, width=10, textvariable=date_value).grid(column=2, row=3, sticky=E)
print(date_value.get())
root.mainloop()
</code>
<code>root = Tk()
mainframe = ttk.Frame(root, padding="3 3 12 12")
mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
ttk.Label(root, text="Date/Time").grid(
column=1, row=3, sticky=E, padx=(5, 0)
)
date_value = StringVar()
date_value.set(datetime.today().strftime("%Y-%m-%d"))
ttk.Entry(root, width=10, textvariable=date_value).grid(column=2, row=3, sticky=E)
print(date_value.get())
root.mainloop()
</code>
root = Tk()
mainframe = ttk.Frame(root, padding="3 3 12 12")
mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
ttk.Label(root, text="Date/Time").grid(
column=1, row=3, sticky=E, padx=(5, 0)
)
date_value = StringVar()
date_value.set(datetime.today().strftime("%Y-%m-%d"))
ttk.Entry(root, width=10, textvariable=date_value).grid(column=2, row=3, sticky=E)
print(date_value.get())
root.mainloop()
What’s weird is I do sometimes see it work in the first example, when there’s some other error in my code that causes a subsequent error it correctly shows with the date filled.
I’m sure I’m missing something very obvious but would love to know what it is!