Я пытаюсь использовать пользовательский класс ttk.Entry для упрощения ввода даты. Две цифры ввода int будут автоматически добавлять текущий год и месяц. Ввод четырехзначных чисел автоматически добавит текущий год. Запись из 8 цифр автоматически переключится на формат даты. Это основная функция, которую я хочу. Однако, если какой-то неправильный ввод, он может показать неправильный массаж и получить фокус этого виджета Entry. Я пытаюсь focus()
и focuse_set()
, но они не работают. У кого-нибудь есть хорошее решение этой проблемы? Заранее спасибо. Вот коды соответственно
from tkinter import *
from tkinter import ttk
from datetime import datetime
class Date_entry(ttk.Entry):
def __init__(self, master=None, textvariable = None, **kwargs):
super().__init__(master=master, textvariable = textvariable, **kwargs)
self.bind('<Return>', (lambda _: self.date_auto_fill(textvariable)))
self.bind('<Tab>', (lambda _: self.date_auto_fill(textvariable)))
def date_auto_fill(self, args):
try:
int(args.get())
if len(args.get()) == 2:
date_show = str(datetime.now().date().year) + '-' + str(datetime.now().date().month) + "-" + str(int(args.get()))
elif len(args.get()) == 4:
date_show = str(datetime.now().date().year) + '-' + str(int(args.get()[0:2])) + "-" + str(int(args.get()[2:4]))
elif len(args.get()) == 8:
date_show = str(int(args.get()[0:4])) + '-' + str(int(args.get()[4:6])) + "-" + str(int(args.get()[6:8]))
else:
date_show = "Wrong Format"
try:
datetime.strptime(date_show, "%Y-%m-%d")
args.set(date_show)
except ValueError:
date_show = "Wrong Format"
args.set(date_show)
self.focus()
except:
try:
datetime.strptime(args.get(), "%Y-%m-%d")
except:
date_show = "Wrong Format"
args.set(date_show)
self.focus_set()
def main():
def print_date(args):
print(args)
r=Tk()
var1 = StringVar()
var2 = StringVar()
msg_var = StringVar()
dateEntry1 = Date_entry(r, var1)
dateEntry1.grid(row =0, column = 0)
dateEntry2 = Date_entry(r, var2)
dateEntry2.grid(row = 0, column = 1)
b=ttk.Button(r, text="Print Date", command = lambda:print_date(var1.get()))
b.grid(row=3)
r.mainloop()
if __name__ == "__main__":
main()