pythonpython-3.xtkintertkinter-canvastkcalendar

Select date range with Tkinter


I'm trying to make a tkinter app where the user can select a date range. The Tkcalendar library only allows to select 1 day, is there a way to select multiple continuous days?

Thank you very much


Solution

  • You can create two calendars and then choose two dates and then find the range between those two dates. The core function would be:

    def date_range(start,stop): # Start and stop dates for range
        dates = [] # Empty list to return at the end
        diff = (stop-start).days # Get the number of days between
        
        for i in range(diff+1): # Loop through the number of days(+1 to include the intervals too)
            day = first + timedelta(days=i) # Days in between
            dates.append(day) # Add to the list
        
        if dates: # If dates is not an empty list
            return dates # Return it 
        else:
            print('Make sure the end date is later than start date') # Print a warning
    

    Now to put things in tkinter perspective, button callbacks cannot return anything, so this should be something like:

    from tkinter import *
    import tkcalendar
    from datetime import timedelta
    
    root = Tk()
    
    def date_range(start,stop):
        global dates # If you want to use this outside of functions
         
        dates = []
        diff = (stop-start).days
        for i in range(diff+1):
            day = start + timedelta(days=i)
            dates.append(day)
        if dates:
            print(dates) # Print it, or even make it global to access it outside this
        else:
            print('Make sure the end date is later than start date')
    
    date1 = tkcalendar.DateEntry(root)
    date1.pack(padx=10,pady=10)
    
    date2 = tkcalendar.DateEntry(root)
    date2.pack(padx=10,pady=10)
    
    Button(root,text='Find range',command=lambda: date_range(date1.get_date(),date2.get_date())).pack() 
    
    root.mainloop()
    

    Keep in mind, the list is full of datetime objects, to make a list full strings of date alone, say:

    dates = [x.strftime('%Y-%m-%d') for x in dates] # In the format yyyy-mm-dd