Tkcalendar очистить DateEntry после перемещения фокуса - PullRequest
1 голос
/ 06 января 2020

У меня есть виджет DateEntry и кнопка для очистки содержимого DateEntry. Я хочу, чтобы DateEntry был пустым, если пользователь не выберет дату.

Моя проблема в том, что если я выбрал виджет DateEntry и наделил его фокусом, то использование кнопки очистки не работает в первый раз, поскольку DateEntry автоматически завершает работу после потери фокуса.

Пример:

from tkinter import *
from tkinter import ttk
from tkcalendar import DateEntry

def clearDateEntry():
    clearButton.focus_set()
    myDateEntry.delete(0,END)

root=Tk()

myDateEntry=DateEntry(root)
myDateEntry.pack()
myDateEntry.delete(0,END)

clearButton=Button(root,text='clear',command=clearDateEntry)
clearButton.pack()

root.mainloop()

Для репликации: установите фокусировку DateEntry, затем нажмите «Очистить».

В функции clearDateEntry() я сначала перемещаю фокус на кнопку очистки что я ожидал бы вызвать автозаполнение, так что я могу удалить его сразу после, но это не работает.

Как мне сделать clearDateEntry() на самом деле очистить DateEntry на первом go ? Если есть способ отключить автозаполнение DateEntry, это также решит мою проблему.

Ответы [ 2 ]

1 голос
/ 06 января 2020

DateEntry установлен для проверки содержимого записи при фокусировке (опция validate установлена ​​в 'focusout'), и если содержимое не является действительной датой, в запись помещается сегодняшняя дата. Идея состоит в том, чтобы всегда иметь правильную дату внутри записи.

Поэтому вы можете просто избавиться от этого поведения, установив

myDateEntry.configure(validate='none')

Таким образом, содержимое записи больше не проверяется при выделении фокуса, но все равно будет проверяться при нажатии на раскрывающуюся кнопку, поэтому при отображении календаря не должно быть проблем с недействительными датами.

1 голос
/ 06 января 2020

Самый простой способ - отложить ваш delete метод на 1 мс:

def clearDateEntry():
    clearButton.focus_set()
    root.after(1, myDateEntry.delete, 0,END)
...