• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

rolando2424

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

22 mensagens neste tópico

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)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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 ]))

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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".

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

"# 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"

... :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

"# 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 :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já agora, é Caninal que queres ter? :) Ou é Canine ou Canibal? :D

Drill Dildo era fabuloso.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

É mesmo Canibal :)

Edit: Ia ser Canibal Clitoris, mas também achei melhor não usar.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Drenching Dick também era uma boa .... :)

Tenho que testar isto :D

O que pensas implementar a seguir?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

Eu ainda estou à espera do GUI do Disk_Princess :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu ainda estou à espera do GUI do Disk_Princess :(

Pensava que não querias mais...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

É das coisas que mais gosto do python!!!!! :(
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

A fazê-los... Ah, fazes bem... wxPython and Tk FTW!

0

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