Можно ли автоматически менять обои на рабочем столе при каждом входе в систему?

Я узнал, как изменить фон с помощью терминала, но могу ли я заставить терминал переключаться на другой фон при каждом входе в систему?

1 ответ

Вступление

Приведенный ниже скрипт принимает каталог в качестве аргумента (желательно, содержащий только изображения), выбирает случайный элемент из его содержимого и устанавливает элемент в качестве обоев. Он предназначен для запуска при входе пользователя в систему, хотя может использоваться и сам по себе.

Настройка и использование

Прежде всего, скрипт должен храниться где-то в системе. Желательно, чтобы он был помещен в ваш ~/bin каталог. Если у вас нет bin каталог в вашем домашнем каталоге, затем просто создайте его.

Затем убедитесь, что скрипт имеет права на выполнение. Вы можете использовать либо chmod +x ~/bin/set_random_wallpaper.py или сделайте это в графическом интерфейсе, щелкнув правой кнопкой мыши по файлу и проверив Allow executing file as program на вкладке Разрешения в меню Свойства.

Сценарий требует каталог в качестве аргумента. Желательно, чтобы вы указали полный путь. Например:

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

Если вы делаете это через командную строку, то вы можете указать относительный путь, Pictures/wallpapers/, но для настройки автоматического запуска при входе в систему используйте полный путь.

Чтобы файл запускался при каждом входе в систему, откройте программу Startup Applications и нажмите кнопку "Добавить". Используйте полный путь к команде и к папке:

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

Это оно!

Источник скрипта

Сценарий также доступен на GitHub:

#!/usr/bin/env python3
"""
Author: Serg Kolo , <1047481448@qq.com>
Date: December, 21,2016
Purpose: Sets random wallpaper from a given directory
Written for: https://Ask-ubuntu.ru/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 __name__ == '__main__': main()

Технические детали и теория работы

Сам скрипт работает довольно простым способом, но я добавил в него несколько своих собственных функций. Функция main проверяет, есть ли аргумент, и является ли этот аргумент каталогом, в противном случае он завершается. Если все в порядке, мы переходим к получению абсолютного пути к каталогу и даем его set_random_uri() функция.

Как вы можете или не можете знать, обои установлены в dconf база данных, которая может быть доступна и изменена с gsettings команда. Простой способ командной строки

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

file://... part - это URI файла (который по сути является закодированным путем к файлу и весьма полезен, если ваша система использует другой языковой стандарт, чем английский). Сначала нам нужно выбрать случайный файл и получить его URI. Это просто - мы используем random.choice() выбрать из списка и os.listdir() получить список элементов в каталоге. Что если наш случайный выбор окажется каталогом, а не файлом? Ну, это то, что в то время как цикл для в select_random_uri, Как только мы довольны выбором, мы получаем его

Ну, оттуда это почти то же самое, что происходит в gsettings set команда, но я использую заказной gsettings_set() функция, избегая необходимости вызывать внешнюю команду, и это было полезно для других проектов, таких как индикатор списка запуска.

Это оно! Получайте удовольствие от написания кода и наслаждайтесь Ubuntu ответственно!

Дополнительный ресурс

Другие вопросы по тегам