'how to disable a date cell in tkcalendar?
# Import Required Library
from tkinter import *
from tkcalendar import Calendar
from  datetime import date
# Create Object
root = Tk()
# Set geometry
root.geometry("400x400")
today = date.today() # today
maxdate=date(2023,12,31) # Maximum date in Year, month , day
# Add Calendar
cal = Calendar(root, selectmode = 'day',
            year = 2020, month = 5,
            day = 22,mindate=today,maxdate=maxdate)
cal.pack(pady = 20)
def grad_date():
    date.config(text = "Selected Date is: " + cal.get_date())
# Add Button and Label
Button(root, text = "Get Date",
    command = grad_date).pack(pady = 20)
date = Label(root, text = "")
date.pack(pady = 20)
# Execute Tkinter
root.mainloop()
for example, i wish christmas and first day of a year to be unable to be selected. (hopefully class will not be used)
*code taken from geeksfrogeeks
Solution 1:[1]
There is no built-in way to disable dates in tkcalendar but it can be added. A clean way to do so is to create a class (I know the OP would rather not use classes but I need to access some internal attributes of the calendar) inheriting from Calendar to add the disable_date() method.
In Calendar, the days are Label widgets and they cannot be selected if they are in disabled state. Therefore, the idea is to store the disabled dates in a list (self._disabled_dates in the code below) and put the labels corresponding to these dates in the disabled state when displaying the calendar (in self._display_calendar() method).
import tkinter as tk
from tkcalendar import Calendar
import datetime
class MyCalendar(Calendar):
    def __init__(self, master=None, **kw):
        self._disabled_dates = []
        Calendar.__init__(self, master, **kw)
    def disable_date(self, date):
        self._disabled_dates.append(date)
        mi, mj = self._get_day_coords(date)
        if mi is not None:  # date is displayed
            self._calendar[mi][mj].state(['disabled'])
    def _display_calendar(self):
        Calendar._display_calendar(self)
        for date in self._disabled_dates:
            mi, mj = self._get_day_coords(date)
            if mi is not None:  # date is displayed
                self._calendar[mi][mj].state(['disabled'])
root = tk.Tk()
cal = MyCalendar(root, selectmode='day',
                 year=2022, month=5, disableddaybackground="red",
                 day=22)
cal.disable_date(datetime.date(2022, 5, 1))
cal.disable_date(datetime.date(2022, 5, 25))
cal.disable_date(datetime.date(2022, 5, 31))
cal.pack(pady=20)
def grad_date():
    date.config(text="Selected Date is: " + cal.get_date())
tk.Button(root, text="Get Date",
          command=grad_date).pack(pady=20)
date = tk.Label(root, text="")
date.pack(pady=20)
root.mainloop()
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source | 
|---|---|
| Solution 1 | j_4321 | 

