¿Quieres aprender a crear un calendario HTML en Python dinámicamente?

El módulo de calendario de Python forma parte de la biblioteca estándar. Permite la salida de un calendario por mes o por año y también proporciona otras funciones relacionadas con el calendario.

 

El módulo de calendario depende del módulo de fecha y hora. Pero también necesitaremos la hora de la fecha para nuestros propios propósitos más tarde, así que es mejor importar ambos. Además, para poder hacer alguna división de cadenas, necesitaremos el módulo re. Importémoslos todos de una sola vez.

 

 import re, datetime, calendar

 

Por defecto, los calendarios comienzan la semana con el lunes (día 0), según la convención europea, y terminan con el domingo (día 6). Si prefiere el domingo como primer día de la semana, utilice el método setfirstweekday() para cambiar el valor predeterminado al día 6 de la siguiente manera:

 

 calendar.setfirstweekday(6)

Para alternar entre los dos, puede pasar el primer día de la semana como argumento usando el módulo sys. A continuación, comprobaría el valor con una sentencia if y establecería el método setfirstweekday() en consecuencia.

 

 import sys

firstday = sys.argv[1]

if firstday == "6":

calendar.setfirstweekday(6)

Preparar los meses del año

En nuestro calendario, sería bueno tener un encabezado para el calendario que diga algo así como "Un calendario generado por Python para...." y tener el mes y el año actual. Para hacer esto, necesitamos obtener el mes y el año del sistema. Esta funcionalidad es algo que proporciona el calendario, Python puede recuperar el mes y el año. Pero aún tenemos un problema. Como todas las fechas del sistema son numéricas y no contienen formas no abreviadas o no numéricas de los meses, necesitamos una lista de esos meses. Introduzca el año de la lista.

 year = ['January',

'February',

'March',

'April',

'May',

'June',

'July',

'August',

'September',

'October',

'November',

'December']

 

Ahora cuando tengamos el número de un mes, podemos acceder a ese número (menos uno) en la lista y obtener el nombre completo del mes.

 

Un día llamado "Hoy"

Iniciando la función main(), vamos a preguntar la hora de la fecha por la hora.

 

 def main():

today = datetime.datetime.date(datetime.datetime.now())

Curiosamente, el módulo datetime tiene una clase datetime. Es a partir de esta clase que llamamos dos objetos: now() y date(). El método datetime.datetime.datetime.now() devuelve un objeto que contiene la siguiente información: año, mes, fecha, hora, minuto, segundo y microsegundos. Por supuesto, no necesitamos la información de tiempo. Para seleccionar la información de fecha solamente, pasamos los resultados de now() a datetime.datetime.datetime.date() como argumento. El resultado es que hoy contiene el año, el mes y la fecha separados por guiones em.

 

Partición de la fecha actual

Para dividir esta parte de los datos en partes más manejables, debemos dividirlos. Entonces podemos asignar las partes a las variables current_yr, current_month y current_day respectivamente.

 

 current = re.split('-', str(today))

current_no = int(current[1])

current_month = year[current_no-1]

current_day = int(re.sub('\A0', '', current[2]))

current_yr = int(current[0])

Para entender la primera línea de este código, trabaje de derecha a izquierda y de adentro hacia afuera. Primero, encordamos el objeto hoy para poder operar sobre él como una cadena. Luego, lo dividimos usando el em-dash como delimitador, o token. Finalmente, asignamos esos tres valores como una lista a `actual'.

 

Para poder tratar estos valores de forma más clara y llamar el nombre largo del mes actual fuera del año, asignamos el número del mes a current_no. Entonces podemos hacer un poco de resta en el subíndice de año y asignar el nombre del mes a current_month.

 

En la siguiente línea, se necesita un poco de sustitución. La fecha que se devuelve desde la hora de la fecha es un valor de dos dígitos incluso para los primeros nueve días del mes. Un cero funciona como un marcador de posición, pero preferimos que nuestro calendario tenga un solo dígito. Así que no sustituimos ningún valor por cada cero que comienza una cadena (por lo tanto,'\A'). Finalmente, asignamos el año a current_yr, convirtiéndolo en un entero a lo largo del camino.

Los métodos que llamaremos más tarde requerirán la entrada en formato entero. Por lo tanto, es importante asegurarse de que todos los datos de fecha se guardan en forma de números enteros, no de cadena.

 

El preámbulo de HTML y CSS

Antes de imprimir el calendario, necesitamos imprimir el preámbulo HTML y el diseño CSS de nuestro calendario. Vaya a esta página para el código para imprimir el preámbulo CSS y HTML para el calendario. y copie el código en su archivo de programa. El CSS en el HTML de este archivo sigue la plantilla ofrecida por Jennifer Kyrnin, About's Guide to Web Design. Si no entiendes esta parte del código, puedes consultar sus ayudas para aprender CSS y HTML. Finalmente, para personalizar el nombre del mes, necesitamos la siguiente línea:

 

 print '

%s %s

' %(current_month, current_yr)

Impresión de los días de la semana

Ahora que se imprime el diseño básico, podemos configurar el calendario por sí mismo. Un calendario, en su punto más básico, es una mesa. Así que vamos a hacer una tabla en nuestro HTML:

 

 print '''

'''

Ahora nuestro programa imprimirá el encabezado deseado con el mes y el año en curso. Si ha utilizado la opción de línea de comandos mencionada anteriormente, aquí debe insertar una sentencia if-else de la siguiente manera:

 

 if firstday == '0': print '''

SundayMondayTuesdayWednesdayThursdayFridaySaturday

 

''' else: ## Aquí asumimos un cambio binario, una decisión entre "0" o no "0''; por lo tanto, cualquier argumento que no sea cero hará que el calendario comience el domingo. print '''.

 

MondayTuesdayWednesdayThursdayFridaySaturdaySunday

 

'''

 

SundayMondayTuesdayWednesdayThursdayFridaySaturday

Obtener los datos del calendario

Ahora tenemos que crear el calendario real. Para obtener los datos reales del calendario, necesitamos el método monthcalendar() del módulo de calendario. Este método toma dos argumentos: el año y el mes del calendario deseado (ambos en forma de números enteros). Devuelve una lista que contiene listas de las fechas del mes por semana. Así que, si contamos el número de artículos en el valor devuelto, tenemos el número de semanas en el mes dado.

 

 month = calendar.monthcalendar(current_yr, current_no)

nweeks = len(month)

 

El número de semanas en un mes

Sabiendo el número de semanas en el mes, podemos crear un bucle que cuenta a través de un rango() desde 0 hasta el número de semanas. Al hacerlo, imprimirá el resto del calendario.

 for w in range(0,nweeks):

week = month[w]

print ""

for x in xrange(0,7):

day = week[x]

if x == 5 or x == 6:

classtype = 'weekend'

else:

classtype = 'day'

if day == 0:

classtype = 'previous'

print '' %(classtype)

elif day == current_day:

print '%s

' %(classtype, day, classtype) else: print '%s

 

' %(classtype, day, classtype) print "" print ''' '''

 

Discutiremos este código línea por línea en la siguiente página.

 

El bucle 'for' examinado

Después de iniciar este intervalo, las fechas de la semana se seleccionan del mes según el valor del contador y se asignan a la semana. A continuación, se crea una fila tabular para contener las fechas del calendario.

A para el bucle y luego camina a través de los días de la semana para que puedan ser analizados. El módulo de calendario imprime un "0" para cada fecha de la tabla que no tenga un valor válido. Un valor en blanco funcionaría mejor para nuestros propósitos, por lo que imprimimos los sujetalibros de los datos tabulares sin un valor para esas fechas.

 

A continuación, si el día es el actual, debemos destacarlo de alguna manera. Basado en la clase td de hoy, el CSS de esta página hará que la fecha actual se renderice contra un fondo oscuro en lugar del fondo claro de las otras fechas.

 

Finalmente, si la fecha es un valor válido y no es la fecha actual, se imprime como datos tabulares. Las combinaciones de colores exactas para estos se encuentran en el preámbulo de estilo CSS.

La última línea del primer bucle cierra la fila. Con el calendario impreso nuestra tarea está terminada y podemos cerrar el documento HTML.

 

 print ""

 

Llamar a la función main()

Como todo este código está en la función main(), no olvides llamarla.

 

 if __name__ == "__main__":

main()

 

Este sencillo calendario se puede utilizar de cualquier manera que necesite una representación de calendario. Mediante el hipervínculo de las fechas en el HTML, se puede crear fácilmente una funcionalidad de diario. Alternativamente, se puede comparar con un archivo de diario y luego reflejar qué fechas se toman por su color. O, si se convierte este programa en un script CGI, se puede generar sobre la marcha.

Por supuesto, esto es sólo un resumen de la funcionalidad del módulo de calendario. La documentación ofrece una visión más completa.

(0 votes)