Utiliza este crédito gratuito para lanzar tus proyectos ahora en Digital Ocean, eres libre de gastarlo cuando quieras en los siguientes 60 días.
Índice del contenido
¿Cómo crear un cambiador de wallpaper automático usando Python en Gnome?
¿Cómo crear un cambiador de wallpaper automático usando Python en Gnome?
En esta entrada vamos a crear un cambiador de wallpaper automático, aleatorio y minimalista para GNU/Linux usando Python. Sin funciones extras, súper ligero y totalmente casero, su única función será seleccionar una imagen aleatoriamente y fijarla como wallpaper. Explicaré la función de cada linea en el código.
Actualizado: Para Gnome 49 y Python 3.12
Si no estas familiarizado con la sintaxis de Python, lee sobre uno de los mejores libros para adentrarte en Python en mi entrada sobre el libro Inmersion en Python .
Para empezar primero cambiemos de directorio a home/
cd ~
Una vez aquí vamos a crear un archivo Python con el nombre .change_wallpaper_randomly.py pero puedes ponerle cualquier otro nombre, solo asegúrate de que el nombre empiece con un punto “.” En GNU/Linux todos los archivos que empiezan con un punto son archivos ocultos, volver nuestro script un archivo oculto nos servirá más adelante.
touch .change_wallpaper_randomly.py
Si en este punto sientes que no estás familiarizado con estos comandos GNU/Linux puedes leer mi entrada sobre los comandos básicos de GNU/Linux para refrescar tu memoria.
Cambiar wallpaper automáticamente con Python
Ahora dentro del archivo que acabamos de crear vamos a colocar el siguiente código
#!/usr/bin/python3
import os
import random
wallpaper_folder = "/home/usuario/Imágenes/wallpaper/" # Coloca aquí tu propia ruta
os.chdir(wallpaper_folder)
allowed_image_formats = ["jpg", "png", "jpeg"]
list_of_images = [image for image in os.listdir() if image.endswith(tuple(allowed_image_formats))]
random_wallpaper = os.path.join(os.getcwd(), random.choice(list_of_images))
os.system("gsettings set org.gnome.desktop.background picture-uri 'file://{}'".format(random_wallpaper))
# Las versiones más nuevas de Gnome usan un parámetro diferente para el tema oscuro
# En este caso usamos el mismo wallpaper para ambos temas
os.system("gsettings set org.gnome.desktop.background picture-uri-dark 'file://{}'".format(random_wallpaper))
Primero importamos las librerias os y random, para tener acceso a herramientas para interactuar con el sistema operativo y métodos para números aleatorios, respectivamente.
A continuación asignamos la ruta donde se encuentran las imágenes a la variable wallpaper_folder, esta ruta tú la defines, es la ubicación de tu carpeta con las imágenes que quieres usar de wallpaper. Para este ejemplo asegúrate de usar una ruta absoluta.
El método os.chdir() nos permitirá cambiarnos al directorio donde tenemos las imágenes que usaremos como wallpapers.
La variable allowed_image_formats establecerá que formatos de imágenes aceptaremos como wallpapers.
La siguiente linea es un poco más compleja y, por la sintaxis, podrás apreciar que se trata de una list comprehension:
list_of_images = [image for image in os.listdir() if image.endswith(tuple(allowed_image_formats))]
os.listdir() nos devolverá una lista con todos los archivos en nuestra carpeta actual, es decir todos aquellos wallpapers contenidos en la carpeta a la que nos cambiamos con os.chdir().
Con tuple(allowed_image_formats) simplemente estamos transformando nuestra lista de formatos aceptados en una tupla.
El método image.endswith() recibe un argumento, que puede ser una cadena de texto o una tupla de cadenas de texto, y nos devolverá True or False dependiendo de si el objeto image termina la cadena de texto con alguno de los elementos de la tupla.
La linea completa es una list comprehension que nos dice: “crea una lista con cada imagen en os.listdir() siempre y cuando el archivo termine con cualquiera de los siguientes formatos en esta tupla”. Este paso es importante pues excluirá todos aquellos archivos que no sean imágenes de nuestra lista.
Ahora, la siguiente linea también puede parecer algo compleja
random_wallpaper = os.path.join(os.getcwd(), random.choice(list_of_images))
El método os.path.join() se encarga de unir rutas en nuestro sistema operativo y es totalmente agnóstico del sistema operativo en el cual nos encontremos. Uniremos la ruta del directorio actual con el nombre de una imagen, para generar la ruta completa de una imagen.
os.getcwd() nos devuelve el directorio actual.
Seleccionar una imagen al azar con random.choice()
Obtendremos aleatoriamente la imagen por medio del método random.choice(), que selecciona una imagen al azar de todas las que obtuvimos con el list comprehension
Mira este ejemplo:
test_list = ["img_1.jpg", "img_2.jpg", "img_3.png", "img_4.png", "img_5.jpeg"]
random.choice(test_list)
"img_4.png"
random.choice(test_list)
"img_1.jpg"
random.choice(test_list)
"img_1.jpg"
Y por último
os.system("gsettings set org.gnome.desktop.background picture-uri 'file://{}'".format(random_wallpaper))
El método os.system() nos permite ejecutar un comando en nuestra terminal.
Ejecutaremos un comando que le dirá a gnome que fije un imagen como wallpaper, le pasaremos la ruta a esa imagen después de picture-uri.
Ojo aquí, cada entorno de escritorio va a tener una manera de fijar un wallpaper, si quisiéramos usar otro entorno de escritorio bastará con leer la documentación y reemplazar el comando dentro del método os.system()
Una vez que terminamos, podemos ejecutar nuestro script de la siguiente manera. Asegúrate de estar en home.
python .change_wallpaper_randomly.py
Si todo salió correctamente tu wallpaper habrá cambiado por una imagen al azar dentro de la carpeta que especificaste. Puedes correr el script las veces que quieras y verás como tu wallpaper cambiará una y otra vez con cada ejecución.
Pero tener que correr este comando cada vez que queremos cambiar de wallpaper es bastante engorroso, ¿no sería genial poder programarlo para que se ejecutara cada cierto tiempo?
Si ya leiste mi entrada sobre crontab y cron ya tienes una idea de como conseguirlo, pasa directo a para programar la ejecución periódica de este script usando crontab .