Posso alterar automaticamente o papel de parede da área de trabalho toda vez que eu fizer logon

1

Aprendi a mudar o plano de fundo através do terminal, mas posso fazer com que o terminal mude para um plano de fundo diferente sempre que eu fizer logon?

    
por Shane W 20.11.2016 / 23:50

1 resposta

1

Introdução

O script abaixo pega um diretório como argumento (de preferência contendo apenas imagens), seleciona o item aleatório para formar seu conteúdo e define o item como papel de parede. Pretende ser iniciado no login do usuário, embora possa ser usado sozinho também.

Configuração e uso

Primeiro, o script deve ser armazenado em algum lugar do sistema. De preferência, ele deve ser colocado no diretório ~/bin . Se você não tiver o diretório bin em seu diretório inicial, basta criar um.

Em seguida, verifique se o script tem permissões executáveis. Você pode usar chmod +x ~/bin/set_random_wallpaper.py ou fazer o caminho da GUI clicando com o botão direito do mouse no arquivo e verificando Allow executing file as program na guia Permissões do menu Propriedades.

O script requer um diretório como argumento. De preferência, você deve dar o caminho completo. Por exemplo:

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

Se você está fazendo isso via linha de comando, então você pode dar caminho relativo, Pictures/wallpapers/ , mas para configurá-lo para ser executado no login automaticamente, use o caminho completo.

Para fazer com que o arquivo seja executado em cada login, abra o programa Startup Applications e clique no botão "Adicionar". Use o caminho completo para o comando e para a pasta:

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

É isso aí!

Origem do script

O script também está disponível em 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 __name__ == '__main__': main()

Detalhes técnicos e teoria de operação

O script em si funciona de maneira bem simples, mas eu o especifiquei com algumas funções minhas. A função principal verifica se existe um argumento e se esse argumento é um diretório - caso contrário, ele será encerrado. Se tudo estiver OK, prosseguiremos para obter o caminho absoluto do diretório e fornecê-lo à função set_random_uri() .

Como você pode ou não saber, o papel de parede está definido em dconf database, que pode ser acessado e alterado com o comando gsettings . A maneira simples de linha de comando é

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

A parte file://... é o URI do arquivo (que é essencialmente um caminho codificado do arquivo e é bastante útil se o sistema usa um código de idioma diferente do inglês). Primeiro, precisamos selecionar o arquivo aleatório e obter seu URI. Isso é simples - usamos random.choice() para selecionar da lista e os.listdir() para obter uma lista de itens no diretório. E se a nossa seleção aleatória for um diretório e não um arquivo? Bem, é para isso que loop é em select_random_uri . Uma vez que estamos felizes com a seleção, obtemos a sua

Bem, a partir daí é praticamente a mesma coisa que está acontecendo no comando gsettings set , mas estou usando a função gsettings_set() , evitando a necessidade de chamar um comando externo, e tem sido útil para outros projetos, como o Indicador de lista de inicialização .

É isso! Divirta-se codificando e desfrute do Ubuntu com responsabilidade!

Recurso adicional

  • A versão do Bash desse script foi implementada antes, consulte: link
por Sergiy Kolodyazhnyy 21.12.2016 / 17:17