DEV Community

Cover image for Manejo de DatePicker en Flet
Matías
Matías

Posted on

Manejo de DatePicker en Flet

Mi último proyecto en Flet requería la implementación de DatePicker. Veamos el ejemplo que proporciona la documentación oficial de Flet.

import datetime
import flet as ft


def main(page: ft.Page):
    page.horizontal_alignment = ft.CrossAxisAlignment.CENTER

    def handle_change(e):
        page.add(ft.Text(f"Date changed: {e.control.value.strftime('%Y-%m-%d')}"))

    def handle_dismissal(e):
        page.add(ft.Text(f"DatePicker dismissed"))

    page.add(
        ft.ElevatedButton(
            "Pick date",
            icon=ft.icons.CALENDAR_MONTH,
            on_click=lambda e: page.open(
                ft.DatePicker(
                    first_date=datetime.datetime(year=2023, month=10, day=1),
                    last_date=datetime.datetime(year=2024, month=10, day=1),
                    on_change=handle_change,
                    on_dismiss=handle_dismissal,
                )
            ),
        )
    )

ft.app(main)
Enter fullscreen mode Exit fullscreen mode

La documentación no aclara si las propiedades first_date y last_date son actualizadas por defecto ante cada ejecución de la aplicación. Asumamos que compilamos una app y los parámetros de first_date y last_date se mantienen como en el código anterior, ¿esto podría generar errores al momento de seleccionar fechas válidas en el futuro?

Mi app está destinada a realizar scraping en X (Twitter) entre dos fechas determinadas. Al buscar hacerla intuitiva y fácil de utilizar (como app ya compilada y ejecutable), revisando el código me pregunté qué sucedería si los parámetros first_date y last_date mantenían los valores adjudicados al momentos de escribir la app. Si dentro de un año, alguien quisiera scrapear hasta ayer, ¿podría hacerlo? ¿Cómo podríamos asegurarnos de que los parámetros sean dinámicos para que la temporalidad se calcule a partir del momento de la ejecución?

Ante la duda, lo resolví de esta manera:

import datetime
import flet as ft

# Crear una variable para la fecha actual de la ejecución
today = datetime.datetime.now()

def main(page: ft.Page):
    page.horizontal_alignment = ft.CrossAxisAlignment.CENTER

    def handle_change(e):
        page.add(ft.Text(f"Date changed: {e.control.value.strftime('%Y-%m-%d')}"))

    def handle_dismissal(e):
        page.add(ft.Text(f"DatePicker dismissed"))

    page.add(
        ft.ElevatedButton(
            "Pick date",
            icon=ft.icons.CALENDAR_MONTH,
            on_click=lambda e: page.open(
                ft.DatePicker(

                    # Configuramos las variables para que un calendario válido desde hace un año a hoy y durante un año a futuro
                    first_date=datetime.datetime(year=today.year - 1, month=today.month, day=today.day),
                    last_date=datetime.datetime(year=today.year + 1, month=today.month, day=today.day),

                    on_change=handle_change,
                    on_dismiss=handle_dismissal,
                )
            ),
        )
    )

ft.app(main)
Enter fullscreen mode Exit fullscreen mode

De este modo, nos aseguramos de que independientemente del momento en que se ejecute la aplicación (compilada o no), las fechas seleccionables en el calendario tendrán un registro temporal configurable tomando como parámetro inicial la ejecución misma.

Este enfoque también resulta útil para implementar funcionalidades específicas que necesiten limitaciones para las fechas seleccionables, como permitir sólo seleccionar hasta el día de hoy, puesto que no tendría sentido elegir fechas a futuro.

Por ejemplo, en mi app de scraping, ¿qué sentido tendría permitir fechas configurables en el futuro cuando la tarea es recopilar información del pasado?

Top comments (0)