python-3.xtkintertkcalendar

Tkcalendar DateEntry - Allow Widget to Return No Selection as Blank


I have created a GUI where the user can select a date from a drop down using the tkcalendar DateEntry widget. I would like to allow the user the option of not selecting a date and leaving this widget blank. However, even if no date is selected the widget returns the current date.

Is there a way to configure the DateEntry to allow for no selection rather than defaulting to the current date if the user does not select a date?

Below is a subset of my code:

import pandas as pd
from tkinter import *
from tkinter.ttk import *
import tkinter as tk
from tkcalendar import DateEntry  

class Window(Frame):
    def __init__(self, master):
        Frame.__init__(self,master)
        master.title('Solar Master Project Tracking')

        # create canvas for scrollable window
        canvas = Canvas(root)
        canvas.grid(row=1,column=0, columnspan=2)

        # create vertical scrollbar and connect it to the canvas
        scrollBar = tk.Scrollbar(root, orient='vertical', command = canvas.yview)
        scrollBar.grid(row=1, column=2, sticky = 'ns')
        canvas.configure(yscrollcommand=scrollBar.set)

        def update_scroll_region(event):
            canvas.configure(scrollregion=canvas.bbox("all"))

        def _on_mousewheel(event):
            canvas.yview_scroll(int(-1*(event.delta/120)), "units")

        # create a frame for the widgets in the scrollable canvas
        scroll_frame = Frame(canvas)
        scroll_frame.bind("<Configure>", update_scroll_region)
        canvas.create_window(0,0, anchor='nw', window = scroll_frame)
        canvas.bind_all("<MouseWheel>", _on_mousewheel)

        # Proposal Date
        self.L18 = Label(scroll_frame, text="Proposal Date:",font=('TKDefaultFont', 8, 'bold'))
        self.L18.grid(row=21, column=0, sticky=W)
        self.prop_date_selection = DateEntry(scroll_frame, width = 25, background = 'LightCyan3',
                                             foreground ='white',borderwidth=2)
        self.prop_date_selection.grid(row=21, column=1,sticky=E)
        self.prop_date_selection.delete(0,"end")


        # SUBMIT INFORMATION
        self.button = tk.Button(root, text="Insert / Update Project",font=('TKDefaultFont', 10, 'bold'),
                                relief=RAISED, command = self.store_user_inputs, bg = "gray80")
        self.button.grid(row=25, column = 0, columnspan=8, sticky = 'EW')

    # STORE USER INPUT
    def store_user_inputs(self):
        prop_date_selection = self.prop_date_selection.get_date()

        global params
        params = [prop_date_selection]
        root.destroy()

if __name__ == "__main__":
    root = Tk()
    Window(root)
    root.mainloop()  

Solution

  • You can create a class inheriting from tkcalendar.DateEntry and modify the get_date() method to return None when the DateEntry is empty:

    import tkcalendar
    
    class DateEntry(tkcalendar.DateEntry):
        def get_date(self):
            if not self.get():
                return None
            self._validate_date()
            return self.parse_date(self.get())