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