2

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

4

2 回答 2

3

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

因此,您可以通过设置简单地摆脱这种行为

myDateEntry.configure(validate='none')

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

于 2020-01-06T09:25:19.477 回答
1

最简单的方法是将您的方法延迟delete1 毫秒:

def clearDateEntry():
    clearButton.focus_set()
    root.after(1, myDateEntry.delete, 0,END)
于 2020-01-06T06:36:42.090 回答