Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #57 da revista programar. Faz já o download aqui!

rolando2424

[Python] Script para mudar wallpaper automaticamente (só Linux/GNOME)

Mensagens Recomendadas

rolando2424    7
rolando2424

Este script procura imagens numa pasta dada, e coloca uma imagem nessa pasta como wallpaper.

Só funciona no Gnome (apesar de já ter andado a ver como é que vou poder expandir este script para o KDE pelo menos).

Aconcelho-vos a modificar a variável "pasta_wallpaper", para indicar o caminho da pasta onde têm os vossos wallpapers, senão têm que estar sempre a usar a flag "-f" ou "--folder".

A ajuda:

rolando@main-computer:~/Desktop$ python wallpaper_change.py -h
Usage: wallpaper_change.py [options]

Options:
 -h, --help            show this help message and exit
 -r, --random          Os wallpapers sao escolhidos aleatoriamente
 -f FOLDER, --folder=FOLDER
                       Utiliza as imagens presentes na pasta "pasta"
 -t TIMER, --timer=TIMER
                       Quanto tempo cada imagem deve de ficar como wallpaper.
                       Suporta o uso de "h", "m" e "s" (exemplo: 10h20m,
                       100h10s, 84000s1h, etc.). Default: 10m
 -R, --recursive       Procura por imagens nas pastas que estao dentro da
                       pasta original

#!/usr/bin/env python2.5

# TODO
# Fazer alguma coisa com ORG_shading_type, ORG_picture_filename, ORG_picture_option ORG_primary_color e ORG_secondary_color na classe Gnome_Client


# CHANGELOG
# V 0.1 (Codename: Awesome Ass) - Criacao do script
# V 0.2 (Codename: Big Boobs) - Poder usar extensoes com 4 letras (JPEG)
# V 0.3 (Codename: Caninal Cohones) - Usa Option Parser para as opcoes e tem a nova opcao timer
#                                     (para dar um valor a "tempo_imagem")
# V 0.4 (Codename: Dungeons Dragons) - Procurar por imagens recursivamente, e a flag "-t" aceita "h", "m", "s" no seu formato

import gconf
import time, os, random, sys, re
import optparse

### Defenicoes do Utilizador
pasta_wallpaper = os.getenv("HOME")+"/Desktop/lol/"
#pasta_wallpaper = os.getenv("HOME")+"/As Minhas Imagens/Wallpapers/"
extensoes_aceites = [".jpg", ".png", ".bmp", ".gif", ".jpeg"]
tempo_imagem = 1 # Tempo que uma imagem fica como wallpaper (tempo dado em segundos)
aleatorio = 0 # Se for 0 as imagens NAO sao escolhidas aleatoriamente
recursivo = 0 # Se for 0 NAO se procura dentro de pastas que estejam na "pasta_wallpaper"
###

### /!\ So mexer a partir daqui se souber o que se esta a fazer! /!\ ###

class Gnome_Client: # Sera isto boa ideia?
   """Class que interage com o registo do Gnome.

   Metodos:
   mudar_background(caminho) - Mudar a imagem de fundo para caminho.
   Retorna 0 se nao der erro, senao 1.

   qual_background() - Retorna o caminho completo do wallpaper actual.

   repor_original() - Coloca o registo como estava antes da execucao do programa.
   """
   def __init__(self):
       self._client = gconf.client_get_default()
       self._guardar_original()

   def _guardar_original(self):
       """Guarda as informacoes iniciais presentes no registo (so guarda as informacoes que podemos
       modificar).
       Nao tem nenhum return."""
       self.ORG_shading_type = self._client.get_string("/desktop/gnome/background/color_shading_type")
       self.ORG_picture_filename = self._client.get_string("/desktop/gnome/background/picture_filename")
       self.ORG_picture_option = self._client.get_string("/desktop/gnome/background/picture_options")
       self.ORG_primary_color = self._client.get_string("/desktop/gnome/background/primary_color")
       self.ORG_secondary_color = self._client.get_string("/desktop/gnome/background/secondary_color")

   def mudar_background(self, caminho):
       """Muda o wallpaper actual para a imagem "caminho".
       Return 0 se nao houver erros, se houver return 1."""

       for ext in extensoes_aceites:
           if caminho[-len(ext):] == ext:
               self._client.set_string("/desktop/gnome/background/picture_filename", caminho)
               return 0
       return 1

   def qual_background(self):
       """Return o caminho completo da imagem que esta a ser usada actualmente como
       wallpaper."""
       return self._client.get_string("/desktop/gnome/background/picture_filename")

   def repor_original(self):
       """Coloca o registo do GNOME como estava antes da execucao deste programa.
       Nao tem nenhum return."""
       self._client.set_string("/desktop/gnome/background/color_shading_type", self.ORG_shading_type)
       self._client.set_string("/desktop/gnome/background/picture_filename", self.ORG_picture_filename)
       self._client.set_string("/desktop/gnome/background/picture_options", self.ORG_picture_option)
       self._client.set_string("/desktop/gnome/background/primary_color", self.ORG_primary_color)
       self._client.set_string("/desktop/gnome/background/secondary_color", self.ORG_secondary_color)


if __name__ == "__main__":

   def parse_argv():
       global aleatorio
       global pasta_wallpaper
       global tempo_imagem
       global recursivo

       argv = optparse.OptionParser()

       argv.add_option("-r", "--random", action="store_true", \
               dest="random", help="Os wallpapers sao escolhidos aleatoriamente")
       argv.add_option("-f", "--folder", action="store", \
               type="string", dest="folder", help="Utiliza as imagens presentes na pasta \"pasta\"")
       argv.add_option("-t", "--timer", action="store", \
               type="string", dest="timer", help="Quanto tempo cada imagem deve de ficar como wallpaper. Suporta o uso de \"h\", \"m\" e \"s\" (exemplo: 10h20m, 100h10s, 84000s1h, etc.). Default: 10m")
       argv.add_option("-R", "--recursive", action="store_true", \
               dest="recursive", help="Procura por imagens nas pastas que estao dentro da pasta original")

       (options, unknown_flags) = argv.parse_args()

       if options.random:
           aleatorio = 1
       if options.folder:
           pasta_wallpaper = options.folder
       if options.timer:
           if options.timer[-1] not in ("h", "m", "s"):
               tempo_imagem = int(options.timer)
           else:
               tempo_imagem = 0

               # Provavelmente existe uma maneira melhor de fazer isto
               # mas sao 2:30 da manha e estou com um sono mais ou menos
               pat_h = re.compile("(\d*?)h") # Non-greedy match
               pat_m = re.compile("(\d*?)m") # """"""""""""""""
               pat_s = re.compile("(\d*?)s") # """"""""""""""""

               if re.search(pat_h, options.timer):
                   tempo_imagem += int(re.search(pat_h, options.timer).groups()[0]) * 3600
               if re.search(pat_m, options.timer):
                   tempo_imagem += int(re.search(pat_m, options.timer).groups()[0]) * 60

               if re.search(pat_s, options.timer):
                   tempo_imagem += int(re.search(pat_s, options.timer).groups()[0])
       if options.recursive:
           recursivo = 1

   client = Gnome_Client()
   parse_argv()

   print "Para parar este script, use Ctrl+C."
   print "Assim restaura as defenicoes originais."

   if pasta_wallpaper[-1] != "/":
       pasta_wallpaper += "/"

   if recursivo != 0:
       direc = os.walk(pasta_wallpaper)
       try:
           cont_pasta = []
           while True:
               tmp_direc = direc.next()
               for ficheiro in tmp_direc[2]:
                   cont_pasta.append(os.path.join(tmp_direc[0], ficheiro))
       except StopIteration: # Nao ha mais pastas dentro da pasta original
           pass
   else:
       # os.walk(path).next()[0] contem o fullpath para a pasta
       # os.walk(path).next()[2] contem o nome dos ficheiros nessa pasta
       lista_ficheiro = [ os.path.join(os.walk(pasta_wallpaper).next()[0], ficheiro) \
               for ficheiro in os.walk(pasta_wallpaper).next()[2] ]

       cont_pasta = filter(lambda ficheiro: \
               filter(lambda extensao: extensao in ficheiro[-len(extensao):], extensoes_aceites), \
               lista_ficheiro)

   try:
       if aleatorio:
           while True:
               client.mudar_background(random.choice(cont_pasta))
               time.sleep(tempo_imagem)
       else:
           while True:
               for wp in cont_pasta:
                   client.mudar_background(wp)
                   time.sleep(tempo_imagem)

   except KeyboardInterrupt: # O unico sinal que podemos apanhar
       client.repor_original()

Para parar o script, usem Ctrl+C no terminal onde executaram, que assim o wallpaper volta ao que estava dantes (não consigo prevenir com o SIGTERM, apesar que estava na ideia que era isso que o Ctrl+C mandava o programa, sendo a única maneira de apanhar esse SIG era executar este script de Python através de um script de Bash).

O engraçado é que eu até nem uso wallpaper (uso só um gradiente vertical feito pelo Gnome :P)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pedrotuga    31
pedrotuga

Não percebi muito bem como isso funciona ;)

Isso não é gajo para se fazer com um script com duas ou tres linhas e corre-le via cron?

É uma ideia porreira, um gajo é brindado com uma imagem nova de x em x tempo.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
rolando2424    7
rolando2424

Mas é claro.

import gconf, random, os

gconf.client_get_default().set_string("/desktop/gnome/background/picture_filename", os.getenv("HOME")+"/As Minhas Imagens/Wallpapers/"+random.choice([ wp for wp in os.listdir(os.getenv("HOME")+"/As Minhas Imagens/Wallpapers") if wp[-3:] in ("jpg", "png", "bmp", "gif") ]))

;)

Ok, um método mais simples para usar noutros pcs.

import gconf, random, os

pasta_wallpaper = os.getenv("HOME")+"/As Minhas Imagens/Wallpapers/" # Nao te esquecas do / no fim!

extensoes_aceites = ("jpg", "png", "bmp", "gif")

gconf.client_get_default().set_string("/desktop/gnome/background/picture_filename", pasta_wallpaper+random.choice([ wp for wp in os.listdir(pasta_wallpaper) if wp[-3:] in extensoes_aceites ]))

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
djthyrax    11
djthyrax

Esse último code fails para .jpeg (sim, é uma extensão válida).

Um script do mesmo género mas Flickr -> Gnome/KDE: http://tanashi.s240.xrea.com/flickrwp/flickrwp.py

Pelo que pude ver:

               if os.system("/usr/bin/dcop kdesktop KBackgroundIface setColor '#%s' false" % options.color) != 0:
                    logging.error("dcop error 1")
                    sys.exit(1)
                if  os.system("/usr/bin/dcop kdesktop KBackgroundIface setColor '#%s' false" % options.color) != 0:
                    logging.error("dcop error 2")
                    sys.exit(1)
                if os.system("/usr/bin/dcop kdesktop KBackgroundIface setWallpaper %s 7" % fname) != 0:
                    logging.error("dcop error 3")
                    sys.exit(1)
                logging.info("changed to " + fname)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
rolando2424    7
rolando2424

djthyrax, eu só coloquei a extensão daqueles que sabia e que tinha.

E por acaso já tinha visto esse código (até já tinha feito bookmark dele), mas não tendo aqui KDE para testar, é capaz de se tornar mais díficil.

Depois eu altero o script para tratar desses casos (não é dificil :))

EDIT: Já está o suporte para extensões de 4 letras

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
djthyrax    11
djthyrax

Ouch, que solução dirty para as 4 letras...

Mete antes assim:

extensoes = ['.png', '.jpg', '.jpeg']
files = ['path/to/file', 'path/to/file.png', 'path/to/file', 'path/to/file', 'path/to/file.jpg', 'path/to/file.jpeg', 'path/to/file']
files = filter(lambda x: filter(lambda y: y in x, extensoes), files)

EDIT: O código acima não vê se está no final do nome. Este sim:

extensoes = ['.png', '.jpg', '.jpeg']
files = ['path/to/file', 'path/to/file.png', 'path/to/file', 'path/to/file', 'path/to/file.jpg', 'path/to/file.jpeg', 'path/to/file', 'path/to/file.jpg.ois']
files = filter(lambda x: filter(lambda y: y in x[-len(y):], extensoes), files)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
rolando2424    7
rolando2424

Djthyrax já implementei a tua sugestão (estava-me a dar um erro porque estava a faltar-me um : em [-len(y)] :))

EDIT: Versão 0.3 lançada. Suporte para OptionParser, "-f", "--folder", "-t", "--timer".

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
JoaoRodrigues    0
JoaoRodrigues

Usa o método walk do módulo os para a tua pesquisa nas pastas :) (recursiva e tudo) vê o meu script do Disk Knight :D

Bom trabalho!

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
rolando2424    7
rolando2424

JoaoRodrigues, a parte de pesquisar imagens recursivamente (e o formato do -t) já tinha feito isso ontem à noite, mas estava com muito sono e não fiz o upload.

E já estava a usar o os.walk :)

Versão 0.4 já está feita

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pedrosorio    5
pedrosorio

"# CHANGELOG

# V 0.1 (Codename: Awesome Ass) - Criacao do script

# V 0.2 (Codename: Big Boobs) - Poder usar extensoes com 4 letras (JPEG)

# V 0.3 (Codename: Caninal Cohones) - Usa Option Parser para as opcoes e tem a nova opcao timer

#                                    (para dar um valor a "tempo_imagem")

# V 0.4 (Codename: Dungeons Dragons) - Procurar por imagens recursivamente, e a flag "-t" aceita "h", "m", "s" no seu formato"

... :)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
rolando2424    7
rolando2424

"# CHANGELOG

# V 0.1 (Codename: Awesome Ass) - Criacao do script

# V 0.2 (Codename: Big Boobs) - Poder usar extensoes com 4 letras (JPEG)

# V 0.3 (Codename: Caninal Cohones) - Usa Option Parser para as opcoes e tem a nova opcao timer

#                                  (para dar um valor a "tempo_imagem")

# V 0.4 (Codename: Dungeons Dragons) - Procurar por imagens recursivamente, e a flag "-t" aceita "h", "m", "s" no seu formato"

... :D

Eu ainda pensei em usar "Drill Dildo", mas achei melhor não :)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
rolando2424    7
rolando2424

O que pensas implementar a seguir?

Sinceramente? Não sei, tal como disse, nem sequer uso um wallpaper no desktop (só um gradiente vertical feito pelo Gnome). Ainda não sei para que fui fazer isto :)

Talvez suporte para KDE, mas não o tenho instalado, nem tenho espaço no disco para o instalar (provavelmente vai ser usando o código que o djthyrax postou).

Talvez um GUI usando wxpython?

Dêem ideias.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Tharis    3
Tharis

Sinceramente? Não sei, tal como disse, nem sequer uso um wallpaper no desktop (só um gradiente vertical feito pelo Gnome). Ainda não sei para que fui fazer isto :P

Talvez suporte para KDE, mas não o tenho instalado, nem tenho espaço no disco para o instalar (provavelmente vai ser usando o código que o djthyrax postou).

Talvez um GUI usando wxpython?

Dêem ideias.

Alguém falou em wxPython e GUIs?!? :) Se for preciso eu faço-a...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
JoaoRodrigues    0
JoaoRodrigues

Alguém falou em wxPython e GUIs?!? :) Se for preciso eu faço-a...

Eu ainda estou à espera do GUI do Disk_Princess :P

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
rolando2424    7
rolando2424

Alguém falou em wxPython e GUIs?!? :( Se for preciso eu faço-a...

Queria ver se fazia eu, para ver se finalmente aprendo a fazer-los.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora


×

Aviso Sobre Cookies

Ao usar este site você aceita a nossa Política de Privacidade