Créez un « bureau infini » sur Ubuntu avec Python et un minuteur systemd
Créer un changeur de fond d'écran GNOME est plus facile que vous ne le pensez. En fait, tout ce dont vous avez besoin est un éditeur de texte de terminal comme nano, l'éditeur de texte en ligne de commande par défaut sous Linux et une minuterie. Voici comment en créer un sur Ubuntu.
Sommaire
Pourquoi se contenter d'un bureau statique quand vous pouvez l'égayer avec un changeur de fond d'écran ?
Construire un changeur de fond d'écran automatique est une façon amusante de personnaliser votre bureau GNOME. Vous pouvez le configurer pour mettre à jour le fond d'écran toutes les secondes, minutes, heures, jours ou semaines, et le personnaliser pour afficher des fonds d'écran thématiques comme l'anime, la nature, les paysages ou les voitures. Et voici le meilleur : GNOME dispose déjà de la plupart des utilitaires dont vous avez besoin pour créer un changeur automatique de fond d'écran. Allons droit au but, d'accord ?
Configuration du bac à sable du projet sur Ubuntu
Puisque nano est préinstallé sur les distributions Linux les plus populaires, restons organisés en créant un dossier de projet dédié. Vous pouvez utiliser la méthode GUI ou la commande mkdir pour ce faire. Donnez au dossier un nom approprié, comme « Wallpaper Changer Project ».
mkdir -p ~/"Wallpaper Changer Project"
Utilisez la commande cd pour accéder au dossier principal du projet et la commande mkdir pour créer un sous-répertoire appelé « Fonds d'écran HD ». Après cela, accédez à Unsplash ou à un autre site Web similaire, téléchargez quelques fonds d'écran HD gratuits ou autant que vous le souhaitez et enregistrez toutes les images dans le dossier « Fonds d'écran HD ».
Le changeur de papier peint prend en charge les extensions de fichiers image .jpg, .jpeg et .png. Donc, téléchargez uniquement des fonds d’écran dans ces versions.
Voilà pour les paramètres du projet. Passons maintenant au vrai plaisir : créer un script pour un changeur de fond d'écran de base qui fonctionne avec les fonds d'écran que vous venez de télécharger.
Codage d'un moteur de fond d'écran qui fonctionne avec les fonds d'écran téléchargés
Lancez votre terminal, cd-dans le dossier « Wallpaper Changer Project » et utilisez nano pour créer un nouveau fichier Python nommé « Wallpaper_changer.py ». Cela fait, copiez et collez le script ci-dessous et enregistrez les modifications.
cd ~/"Wallpaper Changer Project"
nano Wallpaper_changer.py
#!/usr/bin/env python3
import os
import random
import subprocess
# ------------ CONFIGURATIONs ---------------
# Using a list makes it easier to add folders and subfolders later.
# Remember to edit the paths to match yours
WALLPAPER_DIRS = (
"/home/htg/Wallpaper Changer Project/HD Wallpapers",
#------------ Use absolute paths to add other wallpaper folders------------
)
def get_random_wallpaper():
valid_extensions = ('.jpg', '.jpeg', '.png')
all_wallpapers = ()
for folder in WALLPAPER_DIRS:
# ------------Check if the folder actually exists to prevent errors------------
if os.path.exists(folder):
for file in os.listdir(folder):
if file.lower().endswith(valid_extensions):
# ------------Combine folder path and filename------------
all_wallpapers.append(os.path.join(folder, file))
return random.choice(all_wallpapers) if all_wallpapers else None
def set_wallpaper(image_path):
uri = f"file://{image_path}"
try:
subprocess.run((
"gsettings", "set", "org.gnome.desktop.background", "picture-uri", uri
), check=True)
# --------- GNOME has separate settings for light and dark mode ------------
subprocess.run((
"gsettings", "set", "org.gnome.desktop.background", "picture-uri-dark", uri
), check=True)
print(f"Success! Wallpaper set to: {image_path}")
except subprocess.CalledProcessError as e:
print(f"Error setting wallpaper: {e}")
if __name__ == "__main__":
wallpaper = get_random_wallpaper()
if wallpaper:
set_wallpaper(wallpaper)
else:
print("No wallpapers found in the specified directories!")
Dans nano, utilisez Ctrl + O + Entrée pour enregistrer le script et Ctrl + X pour quitter l'éditeur.
Utilisez la commande chmod pour rendre le script exécutable, puis exécutez-le.
chmod +x Wallpaper_changer.py
./Wallpaper_changer.py
Chaque fois que vous exécutez le script, le fond d'écran de votre bureau doit pivoter vers une image dans le sous-répertoire.
Vous disposez désormais d'un changeur de fond d'écran de base qui fonctionne avec les fonds d'écran téléchargés. Mais pourquoi s’arrêter là alors que vous pouvez également extraire et définir des images en ligne comme fond d’écran, n’est-ce pas ?
Connexion à l'API Unsplash pour les fonds d'écran thématiques
Connectons le changeur de fond d'écran à Internet et ajoutons une logique qui applique une chance 50/50 d'utiliser une image téléchargée ou Unsplash pour mettre à jour le fond d'écran du bureau.
Tout d’abord, connectez-vous à Unsplash, puis dirigez-vous vers Unsplash Developers. Une fois sur place, sélectionnez l'option « Vos applications », créez une nouvelle application, acceptez les conditions d'utilisation de l'API, et enfin nommez et créez votre application pour obtenir la clé d'accès à l'API.
Les API gratuites Unsplash ont une limite de « mode démo » de 50 requêtes par heure, nous définirons donc le fond d'écran pour qu'il change toutes les 2 minutes. De plus, lorsque vous nommez votre application sur Unsplash, évitez les mots comme « fond d'écran » ou « image ». Utilisez un nom aléatoire sans rapport avec le changement d’image ou de fond d’écran. Pour cet exemple, j'ai utilisé HTG1.
Deuxièmement, Python peut avoir du mal à se connecter aux serveurs Web sur certaines distributions GNOME. C'est pourquoi vous devriez utiliser apt pour installer une bibliothèque Python qui aide le changeur de papier peint à se connecter à Unsplash.
sudo apt install python3-requests
Utilisez maintenant nano pour ouvrir le script 'Wallpaper_changer.py' existant, puis copiez le code ci-dessous et utilisez-le pour remplacer le code précédent. La nouvelle version a 50/50 de chances d'utiliser un fichier image local ou une image d'Unsplash pour mettre à jour votre fond d'écran GNOME.
nano Wallpaper_changer.py
#!/usr/bin/env python3
import os
import random
import requests
import subprocess
# ------------ CONFIGURATIONs ---------------
# ------------Insert your Unsplash Access Key below------------
ACCESS_KEY = "YOUR_UNSPLASH_ACCESS_KEY_GOES_HERE"
# ------------Edit the directory path to match yours------------
LOCAL_DIR = "/home/htg/Wallpaper Changer Project/HD Wallpapers"
# ------These are the Unsplash API settings. Update the query to any wallpaper theme------
API_URL = f"https://api.unsplash.com/photos/random?client_id={ACCESS_KEY}&orientation=landscape&query=space,galaxy"
def set_wallpaper(image_path):
"""Sets the wallpaper for both Light and Dark modes in Ubuntu GNOME."""
uri = f"file://{image_path}"
schemas = ("picture-uri", "picture-uri-dark")
for key in schemas:
subprocess.run(("gsettings", "set", "org.gnome.desktop.background", key, uri))
def get_web_wallpaper():
save_path = os.path.join(LOCAL_DIR, "web_latest.jpg")
try:
response = requests.get(API_URL, timeout=10)
if response.status_code == 200:
data = response.json()
print(f"(Link) View this wallpaper at: {data('links')('html')}")
image_url = data('urls')('raw') + "&w=1920&h=1080&fit=crop"
img_data = requests.get(image_url, timeout=15)
with open(save_path, 'wb') as f:
f.write(img_data.content)
return save_path
except Exception as e:
print(f"API/Web Error: {e}")
return None
def main():
# ------------This verifies the directory exists before proceeding------------
if not os.path.exists(LOCAL_DIR):
print(f"Error: Could not find folder at {LOCAL_DIR}")
print("Make sure this script is saved INSIDE the 'Wallpaper Changer Project' folder.")
return
# ------------ This is the logic for the 50/50 probability------------
if random.random() > 0.5:
print("(Cloud) Fetching a fresh image from Unsplash...")
wallpaper = get_web_wallpaper()
else:
wallpaper = None
if not wallpaper:
print("(Local) Picking a favorite from your folder...")
files = (os.path.join(LOCAL_DIR, f) for f in os.listdir(LOCAL_DIR)
if f.lower().endswith(('.jpg', '.png', '.jpeg')))
wallpaper = random.choice(files) if files else None
if wallpaper:
set_wallpaper(wallpaper)
print(f"Success! Desktop updated to: {os.path.basename(wallpaper)}")
if __name__ == "__main__":
main()
Après avoir copié et collé le code, utilisez chmod pour rendre le fichier exécutable, puis testez-le.
chmod +x Wallpaper_changer.py
./Wallpaper_changer.py
Le changeur de fond d'écran doit désormais utiliser une logique 50/50 pour mettre à jour le fond d'écran du bureau avec une image téléchargée ou Unsplash. Il reviendra à une image téléchargée lorsqu'il ne pourra pas se connecter à Unsplash.
Automatisation du changement de fond d'écran avec Systemd
Systemd est l'endroit où la magie de l'automatisation se produit. Ouvrez un terminal et utilisez nano pour créer une nouvelle unité de service systemd.
sudo nano /etc/systemd/system/wallpaper-changer.service
Collez-y maintenant la configuration suivante. Il indique à votre ordinateur quel programme exécuter, qui l'exécute et où trouver Python.
(Unit)
Description= Wallpaper Changer Project
# ---This tells the script to wait for an internet connection before trying Unsplash---
After=network-online.target
Wants=network-online.target
(Service)
Type=oneshot
# ----- Edit this to match the full path to Python, your script, and username-----
ExecStart=/usr/bin/python3 "/home/htg/Wallpaper Changer Project/Wallpaper_changer.py"
User=htg
# ------------ This environment variable lets Python talk to the GNOME Desktop
Environment=DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
(Install)
WantedBy=multi-user.target
1000 est la valeur par défaut pour le premier utilisateur créé sur Ubuntu. Si vous n'êtes pas sûr de votre identifiant utilisateur, exécutez id -u dans le terminal. Si ce numéro diffère (par exemple, 1001), mettez à jour la ligne DBUS, mais notez que le changeur de papier peint peut échouer.
Utilisez des raccourcis nano pour enregistrer l'unité de service et quitter. Utilisez à nouveau nano pour créer une unité de minuterie.
sudo nano /etc/systemd/system/wallpaper-changer.timer
Copiez et collez la configuration suivante, puis enregistrez et quittez.
(Unit)
Description=Trigger Wallpaper Changer every 2 minutes
(Timer)
# -----Sets the timer to run 1 minute after boot up-----
OnBootSec=1min
# -----Sets the timer to run every 2 minutes after boot up-----
OnUnitActiveSec=2min
# -----Ensures the timer remains persistent and triggers when the computer wakes up-----
Persistent=true
(Install)
WantedBy=timers.target
Il ne reste plus qu'à activer le timer en rechargeant le démon, puis en activant et en démarrant le timer.
sudo systemctl daemon-reload
sudo systemctl enable --now wallpaper-changer.timer
La minuterie changera automatiquement le fond d'écran toutes les 2 minutes. Vous pouvez également vérifier qu'il fonctionne en vérifiant l'état ou en utilisant journalctl pour afficher le journal.
systemctl list-timers –all | grep wallpaper
journalctl -u wallpaper-changer.service -f
Pourquoi j'abandonne enfin Cron pour les minuteries Systemd sur Ubuntu
Pourquoi se contenter de déclencheurs temporels de base ? Les minuteries Systemd offrent une meilleure journalisation, une meilleure gestion des dépendances et vous pouvez exécuter des scripts « 1 minute après le démarrage ».
Ça y est : vous avez créé avec succès un changeur de fond d'écran automatique qui met à jour votre fond d'écran GNOME avec des images Unsplash téléchargées ou thématiques.
