Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions tests/test_dateentry.py
Original file line number Diff line number Diff line change
Expand Up @@ -165,3 +165,17 @@ def test_dateentry_functions(self):
self.window.update()
widget._select()
self.assertIn('readonly', widget.state())

def test_dateentry_allow_empty(self):
widget = DateEntry(self.window, allow_empty=True)
widget.pack()
self.window.update()

self.assertTrue(widget._allow_empty)
self.assertEqual(widget.get(), '') # should start with no value
widget.focus_set()
self.window.focus_set()
self.assertEqual(widget.get(), '') # should not populate with a value

self.assertRaises(IndexError, widget.get_date)
self.assertRaises(ValueError, widget.set_date, '')
18 changes: 12 additions & 6 deletions tkcalendar/dateentry.py
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ class DateEntry(ttk.Entry):
'width': 12,
'xscrollcommand': ''}

def __init__(self, master=None, **kw):
def __init__(self, master=None, allow_empty=False, **kw):
"""
Create an entry with a drop-down calendar to select a date.

Expand Down Expand Up @@ -143,6 +143,7 @@ def __init__(self, master=None, **kw):
validatecmd = self.register(self._validate_date)
self.configure(validate='focusout',
validatecommand=validatecmd)
self._allow_empty = allow_empty # defaults to False

# initially selected date
self._date = self._calendar.selection_get()
Expand All @@ -155,7 +156,8 @@ def __init__(self, master=None, **kw):
self._date = self._calendar.date(year, month, day)
except ValueError:
self._date = today
self._set_text(self.format_date(self._date))
if not self._allow_empty:
self._set_text(self.format_date(self._date))

# --- bindings
# reconfigure style if theme changed
Expand Down Expand Up @@ -288,8 +290,11 @@ def _validate_date(self):
else:
return True
except (ValueError, IndexError):
self._set_text(self.format_date(self._date))
return False
if self._allow_empty and self.get().strip() == '':
return True
else:
self._set_text(self.format_date(self._date))
return False

def _select(self, event=None):
"""Display the selected date in the entry and hide the calendar."""
Expand Down Expand Up @@ -328,7 +333,6 @@ def drop_down(self):
self._top_cal.withdraw()
else:
self._validate_date()
date = self.parse_date(self.get())
x = self.winfo_rootx()
y = self.winfo_rooty() + self.winfo_height()
if self.winfo_toplevel().attributes('-topmost'):
Expand All @@ -338,7 +342,9 @@ def drop_down(self):
self._top_cal.geometry('+%i+%i' % (x, y))
self._top_cal.deiconify()
self._calendar.focus_set()
self._calendar.selection_set(date)
if self.get().strip() != '':
date = self.parse_date(self.get())
self._calendar.selection_set(date)

def state(self, *args):
"""
Expand Down