
import tkinter as tk
from tkcalendar import DateEntry
from datetime import date
my_w = tk.Tk()
my_w.geometry("320x210")
dt1=date(2021,8,3) # Minimum date for selection
dt2=date(2021,8,25) # Maximum date for selection
cal=DateEntry(my_w,selectmode='day', mindate=dt1, maxdate=dt2)
cal.grid(row=1,column=1,padx=15)
my_w.mainloop()
import tkinter as tk
from tkcalendar import DateEntry
from datetime import datetime
my_w = tk.Tk()
my_w.geometry("320x210")
date_today = datetime.now() # today's date
cal=DateEntry(my_w,selectmode='day', mindate=date_today)
cal.grid(row=1,column=1,padx=15)
my_w.mainloop()
We can disable selection of all future dates by using maxdate option
cal=DateEntry(my_w,selectmode='day', maxdate=date_today)
from datetime import timedelta,date,datetime
dt = date.today() + timedelta(days=1) # Tomorrow
cal=DateEntry(my_w,selectmode='day',maxdate=dt)
Select all days starting from yesterday
dt = date.today() + timedelta(days=-1) # Yesterday
cal=DateEntry(my_w,selectmode='day',mindate=dt)
from dateutil.relativedelta import relativedelta
from datetime import date
dt = date.today() + relativedelta(days=1))# tomorrow
Check how future dates are enabled using relativedelta.
import tkinter as tk
from tkcalendar import DateEntry
from dateutil.relativedelta import relativedelta
from datetime import date
my_w = tk.Tk()
my_w.geometry("320x210")
dt = date.today() + relativedelta(years=1,months=2,days=3)
cal=DateEntry(my_w,selectmode='day',maxdate=dt,mindate=date.today())
cal.grid(row=1,column=1,padx=15)
my_w.mainloop()
import tkinter as tk
from tkcalendar import DateEntry
from datetime import timedelta,date,datetime
my_w = tk.Tk()
my_w.geometry("380x220")
sel=tk.StringVar()
def my_upd(*args): # triggered when value of string varaible changes
dt=sel.get()#cal.selection_get() # minmum date
#print(dt + ": "+str(len(dt)))
if(len(dt)>3): # when dt is having date selection
dt1 = datetime.strptime(dt,'%m/%d/%y') # create date type
dt2=dt1 + timedelta(days=10) # maximum date, added 10 days
cal.config(mindate=dt1) # set minimum date
cal.config(maxdate=dt2) # set maximum date
cal=DateEntry(my_w,selectmode='day',textvariable=sel)
cal.grid(row=1,column=1,padx=15)
b1=tk.Button(my_w,text='Reset'
,command=lambda:cal.config(mindate=None,maxdate=None))
b1.grid(row=1,column=2)
sel.trace('w',my_upd) # on change of string variable
my_w.mainloop()
def reset():
date_today = datetime.now() # today's date
cal.set_date(date_today) # before resetting min & max date
cal.config(mindate=None) # reset mindate
cal.config(maxdate=None) # reset maxdate
We can modify the button code to trigger the above function
b1=tk.Button(my_w,text='Reset',command=lambda:reset())
Here we are first setting the calendar default date to today and then resetting the maxdate, mindate. If you change the order then the callback function my_upd will be executed ( as we are using trace() method of string variable ) and change the mindate, maxdate to new value.
Author & Instructor at plus2net
I write and maintain practical tutorials on Python, PHP, SQL, JavaScript, HTML, jQuery, and web development at plus2net. The tutorials focus on clear explanations, working examples, and code that readers can test and adapt while learning.