DEV Community

Cover image for Cómo crear un Wallpaper dinámico con la Hora y Fecha usando Python
Code Chappie
Code Chappie

Posted on

Cómo crear un Wallpaper dinámico con la Hora y Fecha usando Python

Si alguna vez has querido tener un wallpaper (fondo de pantalla) que se actualice automáticamente con la hora y la fecha actual, este tutorial es para ti. Usaremos Python y algunas bibliotecas como PIL (Pillow) para generar una imagen, agregar texto dinámico con la hora y la fecha, y luego establecer esta imagen como fondo de pantalla en Windows.

¿Qué necesitamos?

  • Python instalado: Si aún no tienes Python instalado, puedes descargarlo desde python.org.

  • Instalar bibliotecas:

    • Pillow: Para trabajar con imágenes.
    • ctypes: Para interactuar con el sistema operativo y cambiar el fondo de pantalla en Windows.

Puedes instalar Pillow ejecutando el siguiente comando en tu terminal o cmd: pip install pillow

  • Un archivo de fuente: Necesitamos una fuente TrueType (.ttf) para renderizar el texto en la imagen. En el código de ejemplo, usamos la fuente FiraCode, pero puedes utilizar cualquier fuente que prefieras.

1. Importaciones y configuración inicial

Al comienzo del script, importamos las bibliotecas necesarias y definimos algunos parámetros iniciales como el color de fondo, el color del texto, el tamaño de la fuente y la ruta del archivo de la fuente:

from PIL import Image, ImageDraw, ImageFont
import ctypes, os, time, io
from datetime import datetime

background_color = (0, 0, 0)  # Color de fondo (negro)
text_color = (22, 230, 69)  # Color del texto (verde)
font_size = 30
font_path = r"c:/Users/david/Desktop/FiraCodeRegular.ttf"  # Ruta de la fuente
font = ImageFont.truetype(font_path, font_size)

screen_width = 1920
screen_height = 1080
Enter fullscreen mode Exit fullscreen mode
  • Pillow (Image, ImageDraw, ImageFont) se utiliza para crear la imagen y dibujar el texto.
  • ctypes se usa para cambiar el wallpaper en Windows.
  • time y datetime nos permiten manejar los tiempos y fechas.
  • background_color y text_color son los colores que usaremos para el fondo y el texto.

2. Formateo de la fecha y hora

Definimos una función para asegurarnos de que los números de la fecha y la hora se formateen siempre con dos dígitos:

def two_digits_format(number):
    return f"0{number}" if number < 10 else number
Enter fullscreen mode Exit fullscreen mode

Por ejemplo, el día "5" se formateará como "05", y lo mismo ocurrirá con la hora, minuto y segundo.

3. Generar la imagen con la fecha y hora

La función agregar_texto_a_imagen() crea una nueva imagen en blanco con el tamaño de la pantalla (en este caso, 1920x1080) y dibuja el texto en el centro:

def agregar_texto_a_imagen():
    now = datetime.now()

    texto = f"""{{
    "date": {{
        "day": {two_digits_format(now.day)},
        "month": {two_digits_format(now.month)},
        "year": {now.year}
    }},
    "time": {{
        "hour": {two_digits_format(now.hour)},
        "minute": {two_digits_format(now.minute)},
        "second":  {two_digits_format(now.second)},
        "meridiem": "{now.strftime("%p")}"
    }}
}}"""
Enter fullscreen mode Exit fullscreen mode

En esta función, obtenemos la fecha y la hora actual utilizando datetime.now(), y luego formateamos el texto en formato JSON. Esto se renderiza en la imagen que generamos.

Después, calculamos el centro de la pantalla para colocar el texto allí:

bbox = draw.textbbox((0, 0), texto, font=font)
ancho_texto = bbox[2] - bbox[0]
altura_texto = bbox[3] - bbox[1]
posicion_x = (ancho_imagen - ancho_texto) // 2
posicion_y = (altura_imagen - altura_texto) // 2
posicion = (posicion_x, posicion_y)
Enter fullscreen mode Exit fullscreen mode

4. Establecer la imagen como fondo de pantalla

La función establecer_como_wallpaper() guarda la imagen generada como un archivo temporal y luego la establece como el fondo de pantalla:

def establecer_como_wallpaper(imagen_bytes):
    temp_path = r"C:/Users/david/Pictures/temp_wallpaper.bmp"
    if os.path.exists(temp_path):
        os.remove(temp_path)

    with open(temp_path, "wb") as f:
        f.write(imagen_bytes.read())

    ctypes.windll.user32.SystemParametersInfoW(
        20, 0, temp_path, 3
    )  # Establecer la imagen temporal
Enter fullscreen mode Exit fullscreen mode

Aquí, ctypes.windll.user32.SystemParametersInfoW es una función de Windows que permite cambiar el fondo de pantalla.

5. Actualización continua del wallpaper

En el ciclo while True:, la imagen se genera y se establece como fondo de pantalla una vez por segundo:

while True:
    start_time = time.time()
    imagen_bytes = agregar_texto_a_imagen()
    establecer_como_wallpaper(imagen_bytes)
    elapsed_time = time.time() - start_time

    if elapsed_time < 1:
        time.sleep(1 - elapsed_time)
    else:
        time.sleep(1)
Enter fullscreen mode Exit fullscreen mode

Este ciclo asegura que el fondo de pantalla se actualice cada segundo con la hora y la fecha actuales.

Código completo aquí: GitHub

Conclusión

Este código ofrece una manera sencilla de generar un fondo de pantalla dinámico que siempre muestra la hora y la fecha actual. Puedes personalizar la apariencia del fondo de pantalla ajustando los colores, la fuente y el tamaño de la imagen. Además, el código está diseñado para ser eficiente, con la actualización del fondo de pantalla ocurriendo cada segundo.

Si estás buscando una forma divertida de aprender sobre manipulación de imágenes en Python y cómo interactuar con el sistema operativo, este proyecto es un excelente punto de partida.

Top comments (0)