¿Cómo agrego un calendario o selector de fecha a tkinter?
La biblioteca estándar no incluye widget de fecha, así que hace falta un paquete: tkcalendar trae DateEntry, un campo de texto con un calendario que se despliega al hacer clic.
# pip install tkcalendar
import tkinter as tk
from tkcalendar import DateEntry
root = tk.Tk()
picked = DateEntry(root, date_pattern="yyyy-mm-dd")
picked.pack(padx=10, pady=10)
def save():
d = picked.get_date() # un datetime.date
print(d, d.year, d.month)
tk.Button(root, text="Guardar", command=save).pack()
root.mainloop() get_date() y get() no son lo mismo
get_date() devuelve un datetime.date, que es lo que quieres para guardar, comparar o hacer cuentas. get() devuelve el texto tal como se muestra, siguiendo date_pattern, así que el mismo día se lee como 2026-03-09 con un patrón y como 09/03/2026 con otro.
Eso convierte al patrón en un asunto de presentación nada más. Cámbialo con libertad para tus usuarios sin tocar el código que lee el valor, siempre que ese código use get_date().
picked.get_date() # datetime.date(2026, 3, 9)
picked.get() # '2026-03-09' o '09/03/2026', según date_patternPoner la fecha desde el código
set_date() acepta un objeto date y mueve tanto el campo como el calendario, que es como se restaura un valor guardado al abrir una ventana.
import datetime
picked.set_date(datetime.date(2026, 3, 9))Limitar el rango
mindate y maxdate desactivan todo lo que quede fuera del rango que permitas, y eso protege mejor que validar después: un formulario de reservas que no puede ofrecer el día de ayer nunca tiene que rechazarlo.
DateEntry(root, mindate=datetime.date.today())Si ya usas ttkbootstrap
ttkbootstrap trae su propio campo de fecha, que combina con el tema activo, así que un proyecto que ya lo use no necesita además tkcalendar. En tkinter puro y en CustomTkinter, tkcalendar es el paquete a instalar.
Hacerlo sin buscarlo
Arrastra un Date picker y la exportación agrega el import correcto para el toolkit que hayas elegido, junto con la línea de pip en los requisitos generados. El formato mostrado es un desplegable del inspector, y el stub del manejador lee el valor de la forma que sobrevive a un cambio de formato.
Diseña la ventana visualmente y ve el código Python generado sobre la marcha.
Abrir el diseñador de tkinter →