web-dev-qa-db-fra.com

Puis-je changer automatiquement le fond d'écran chaque fois que je me connecte?

J'ai appris à changer d'arrière-plan via le terminal, mais puis-je le faire changer de fond à chaque fois que je me connecte?

2
Shane W

Introduction

Le script ci-dessous prend un répertoire en argument (contenant de préférence uniquement des images), sélectionne un élément aléatoire de son contenu et définit l'élément en tant que papier peint. Il est destiné à être démarré à la connexion de l'utilisateur, mais peut également être utilisé seul.

Mise en place et utilisation

Tout d'abord, le script doit être stocké quelque part sur le système. De préférence, il devrait être placé dans votre répertoire ~/bin. Si vous n'avez pas le répertoire bin dans votre répertoire personnel, créez-en un.

Ensuite, assurez-vous que le script dispose d'autorisations exécutables. Vous pouvez utiliser chmod +x ~/bin/set_random_wallpaper.py ou le faire à l'aide d'une interface graphique en cliquant avec le bouton droit de la souris sur le fichier et en cochant Allow executing file as program dans l'onglet Autorisations du menu Propriétés.

Le script nécessite un répertoire comme argument. De préférence, vous devriez lui donner le chemin complet. Par exemple:

set_random_wallpaper.py /home/JohnDoe/Pictures/wallpapers/ 

Si vous le faites via la ligne de commande, vous pouvez alors donner le chemin relatif, Pictures/wallpapers/, mais pour le configurer pour qu'il s'exécute lors de la connexion automatiquement, utilisez le chemin complet.

Pour que le fichier soit exécuté à chaque connexion, ouvrez le programme Applications de démarrage et cliquez sur le bouton "Ajouter". Utilisez le chemin complet de commande et de dossier:

/home/JohnDoe/bin/set_random_wallpaper.py /home/JohnDoe/Pictures/wallpapers/ 

C'est ça !

Source du script

Le script est également disponible sur GitHub :

#!/usr/bin/env python3
"""
Author: Serg Kolo , <[email protected]>
Date: December, 21,2016
Purpose: Sets random wallpaper from a given directory
Written for: https://askubuntu.com/q/851705/295286
"""
from gi.repository import Gio
import os,sys,random

def gsettings_set(schema, path, key, value):
    """Set value of gsettings schema"""
    if path is None:
        gsettings = Gio.Settings.new(schema)
    else:
        gsettings = Gio.Settings.new_with_path(schema, path)
    if isinstance(value, list):
        return gsettings.set_strv(key, value)
    if isinstance(value, int):
        return gsettings.set_int(key, value)
    if isinstance(value,str): 
        return gsettings.set_string(key,value)

def error_and_exit(message):
    sys.stderr.write(message + "\n")
    sys.exit(1)

def select_random_uri(dir_path):

    selection = random.choice(os.listdir(dir_path))
    selection_path = os.path.join(dir_path,selection)
    while not os.path.isfile(selection_path):
        selection = random.choice(os.listdir(dir_path))
        selection_path = os.path.join(dir_path,selection)

    selection_uri = Gio.File.new_for_path(selection_path).get_uri()
    return selection_uri

def main():
    """ Program entry point"""
    if len(sys.argv) != 2:
       error_and_exit('>>> Script requires path to a directory as single argument')
    if not os.path.isdir(sys.argv[1]):
       error_and_exit('>>> Argument is not a directory')   
    img_dir = os.path.abspath(sys.argv[1])
    uri = select_random_uri(img_dir)
    try:
        gsettings_set('org.gnome.desktop.background',None,'picture-uri',uri)
    except Exception as ex:
       error_and_exit(ex.repr()) 

if __== '__main__': main()

Détails techniques et théorie de fonctionnement

Le script lui-même fonctionne de manière assez simple, mais je l'ai agrémenté de quelques fonctions. La fonction principale vérifie s'il existe un argument et si cet argument est un répertoire - sinon, il se ferme. Si tout va bien, nous obtenons le chemin absolu du répertoire et le donnons à la fonction set_random_uri().

Comme vous le savez peut-être ou non, le papier peint est défini dans la base de données dconf, qui peut être consultée et modifiée à l'aide de la commande gsettings. Le moyen simple en ligne de commande est

gsettings set org.gnome.desktop.background picture-uri file:///home/JohnDoe/Pictures/cool_wallpaper.jpg

La partie file://... correspond à l'URI du fichier (qui est essentiellement un chemin codé du fichier et est très utile si votre système utilise des paramètres régionaux différents de celui de l'anglais). Premièrement, nous devons sélectionner un fichier aléatoire et obtenir son URI. C'est simple - nous utilisons random.choice() pour sélectionner une liste et os.listdir() pour obtenir la liste des éléments du répertoire. Que faire si notre sélection aléatoire se trouve être un répertoire et non un fichier? C'est ce à quoi sert la boucle while dans select_random_uri. Une fois que nous sommes satisfaits de la sélection, nous obtenons sa

Eh bien, à partir de là, c'est à peu près la même chose qui se passe dans la commande gsettings set, mais j'utilise la fonction personnalisée gsettings_set(), ce qui évite d'avoir à appeler une commande externe. utile pour d'autres projets, tels que indicateur de liste de lanceurs .

C'est ça ! Amusez-vous à coder et profitez d'Ubuntu de manière responsable!

Ressource supplémentaire

1
Sergiy Kolodyazhnyy