Tkcalendar 移动焦点后清除 DateEntry

Tkcalendar clear DateEntry after moving focus

我有一个 DateEntry 小部件和一个用于清除 DateEntry 内容的按钮。我希望 DateEntry 为空,除非用户 select 是一个日期。

我的问题是,如果我 select 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?如果有办法关闭 DateEntry 的自动完成,那也可以解决我的问题。

最简单的方法是将 delete 方法延迟 1 毫秒:

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

DateEntry设置为在聚焦时验证条目内容(validate选项设置为'focusout'),如果内容不是有效日期,则为今天的日期放在条目中。这个想法是在条目中始终有一个有效日期。

因此您可以通过设置

简单地摆脱这种行为

myDateEntry.configure(validate='none')

通过这种方式,条目内容不再在聚焦时进行验证,但在单击下拉按钮时仍会进行验证,因此在显示日历时应该不会出现无效日期的问题。