Пользовательская проблема фокуса класса виджета ttk.Entry, python 3 - PullRequest
0 голосов
/ 17 февраля 2020

Я пытаюсь использовать пользовательский класс 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...