From 7014009a583d41f9d540b0be27554aa167914594 Mon Sep 17 00:00:00 2001 From: teauxfu Date: Sat, 24 Apr 2021 00:17:07 -0500 Subject: [PATCH 1/2] optionally allow empty/whitespace values --- tkcalendar/dateentry.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/tkcalendar/dateentry.py b/tkcalendar/dateentry.py index e6d782e..bdbb9bd 100644 --- a/tkcalendar/dateentry.py +++ b/tkcalendar/dateentry.py @@ -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. @@ -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() @@ -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 @@ -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.""" @@ -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'): @@ -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): """ From 8b8b0be2d0918609d92be89686664903ca3d06c5 Mon Sep 17 00:00:00 2001 From: teauxfu Date: Sat, 24 Apr 2021 21:30:01 -0500 Subject: [PATCH 2/2] add tests for widgets made with allow_empty=True --- tests/test_dateentry.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tests/test_dateentry.py b/tests/test_dateentry.py index 52ac4db..0f2618d 100644 --- a/tests/test_dateentry.py +++ b/tests/test_dateentry.py @@ -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, '')