Re: [Screenshots] Épatez la galerie, présentez votre bureau!
Publié : mer. 15 août 2012, 11:04
Forum d'entraide ! Posez vos questions ici
https://forums.archlinux.fr/
/usr/share/fonts
(j'avoue mes lacunes en la matière )Code : Tout sélectionner
#!/usr/bin/python
# jeu. 09 août 2012 à 10h40
# python3-imaging
# -*- coding: utf-8 -*-
from urllib.request import urlopen
from Image import ANTIALIAS
from Image import open as open_image
from time import time
from os.path import join, exists, isfile, split
from os import stat, access, R_OK, W_OK
from sys import stderr, argv, exit
from getopt import getopt, GetoptError
############
# Définition de la classe Var
########################
class Var :
def __init__(self):
self.url = str()
self.picture = str()
self.emplacement = str()
self.cible = str()
self.chaine = str()
self.page = str()
self.box = list()
self.resize = list()
self.time = int()
############
# Définition des fonctions
########################
def help():
print("Usage : {0} [options]".format(argv[0]))
print(" Options :")
print(" -c : Découpage AxBxLxH où A est le décalage x, B le décalage y, L et H la longueur et la hauteur à découper")
print(" -h : Cette aide")
print(" -i : Information sur la chaine à rechercher")
print(" -o : Emplacement de sauvegarde ex.: /tmp/image_sat.jpg")
print(" -p : Page internet où trouver l'url d'une image")
print(" -r : Redimensionnement de l'image AxB")
print(" -t : Temps avant de pouvoir retélécharger l'image initiale")
print(" -u : L'adresse où télécharger l'image\n")
print(" Exemple 1 :\n {0} -c 0x110x1274x657 -r 400x220 -o /tmp/image_sat.jpg -u http://oiswww.eumetsat.org/IPPS/html/latestImages/EUMETSAT_MSG_RGB-naturalcolor-westernEurope.jpg -t 3600\n".format(argv[0]))
print(" Exemple 2 :\n {0} -c 0x0x960x528 -r 400x219 -o /tmp/image_marine.jpg -p http://marine.meteoconsult.fr/carte/meteo-marine/frontologie_0.php#etiquette -i http://images.meteoconsult.fr/image/mc-france/cartes/frontologie/produits/ -t 3600".format(argv[0]))
exit(1)
def isNumber(number):
try :
a = int(number)
return a
except ValueError:
stderr.write(number + " n'est pas un nombre valide !\n")
exit(1)
def recup_arg(var, arg):
if len(arg) < 2:
help()
else:
try:
# c : crop
# h : help
# i : information of search string
# o : save file
# p : page to search url image
# r : resize
# t : time
# u : url
opts, args = getopt(arg[1:], "c:hi:o:p:r:t:u:")
except GetoptError as err:
stderr.write(err + "\n")
help()
for o, a in opts:
if o == "-c":
var.box = [isNumber(val) for val in a.split("x")]
elif o == "-h":
help()
elif o == "-i":
var.chaine = a
elif o == "-o":
(var.emplacement, var.cible) = split(a)
if not (access(var.emplacement, R_OK) and access(var.emplacement, W_OK)):
stderr.write("Vous n'avez pas les droits sur : " + var.emplacement + "\n")
exit(1)
elif o == "-p":
var.page = a
elif o == "-r":
var.resize = [isNumber(val) for val in a.split("x")]
elif o == "-t":
var.time = isNumber(a)
elif o == "-u":
(var.url, var.picture) = split(a)
def download():
sav_file = join(var.emplacement, var.picture)
# Téléchargement de l'image
img = urlopen(join(var.url, var.picture))
# Sauvegarde de l'image
with open(sav_file, "wb") as source:
source.write(img.read())
def crop():
sav_file = join(var.emplacement, var.picture)
# On ouvre l'image que l'on vient de télécharger
img_source = open_image(sav_file)
# Exemple: On découpe l'image en se plaçant à 0 pixel de la gauche et 110 à partir du haut. Ensuite on dessine un cadre de 1274x657. Pour finir, on redimensionne l'image avec de l'antialias
img_cible = img_source.crop(var.box).resize((var.resize), ANTIALIAS)
# On enregistre la nouvelle image
img_cible.save(join(var.emplacement, var.cible))
def search_url():
if var.page != str():
dl = urlopen(var.page).read().decode('utf-8', 'ignore')
for lecture in dl.split(" "):
if var.chaine in lecture:
(var.url, var.picture) = split(lecture.split("=")[1][1:-1])
return
############
# Début du programme
########################
if __name__ == "__main__":
# Initialisation des variables
var = Var()
# Récupération des arguments de la ligne de commandes
recup_arg(var, argv)
# On regarde si la photo existe déjà
path_thumbnail = join(var.emplacement, var.cible)
if exists(path_thumbnail) and isfile(path_thumbnail):
# Si elle existe, on regarde si elle date de moins d'une heure
now = time()
time_pic = stat(path_thumbnail)[8]
if time_pic + var.time <= now:
# On cherche l'url d'une image sur une page
search_url()
# on télécharge la nouvelle photo
download()
# On découpe l'image
crop()
else:
# On cherche l'url d'une image sur une page
search_url()
# On télécharge la photo
download()
# On découpe l'image
crop()
Code : Tout sélectionner
#Fonctionnement de conky
total_run_times 0 #Temps en secondes ; 0 = toujours actif
background yes #Pour que conky tourne en arrière plan ; no = pour les tests
#Mémoire
double_buffer yes #Éviter le clignotement
no_buffers yes #Soustraire les mémoires tampons de la mémoire utilisée
text_buffer_size 1024 #Taille du cache pour le texte
#Affichage
out_to_console no #Affiche le texte sur la sortie standard
update_interval 10 #Taux de rafraîchissement de la fenêtre (s)
#Fenêtre conky
alignment bottom_left #Alignement
#---
gap_x 2 #Écart avec le bord gauche / droit
gap_y 26 #Écart avec le bord haut / bas
#---
draw_shades no #Afficher les ombres
draw_outline no #Afficher les contours de fenêtre
draw_borders yes #Afficher des contours autour des blocs de texte
border_width 2 #Largeur du contour
border_inner_margin 0 #Largeur des marges
#---
own_window yes #Utiliser sa propre fenêtre
own_window_type override #Type de fenêtre ; normal / override / desktop
# own_window_type normal #Type de fenêtre ; normal / override / desktop
own_window_transparent yes #Pseudo transparence
# own_window_hints undecorated,below,sticky,skip_taskbar,skip_pager # définition du type
own_window_class Conky
#Mise en forme
use_xft yes #Utiliser Xft (polices lissées etc)
xftalpha .1 #Utiliser Xft
override_utf8_locale yes #Force l'UTF8
uppercase no #Tout le texte en majuscule
use_spacer right #Ajoute des espaces après certains objets (qu'avec des polices fixes)
#---
xftfont Monospace:size=10 #Police par défaut
#---
default_bar_size 30 3 #Barre par défaut (longeur hauteur)
# stippled_borders 5 #Taille des pointillés
#Couleurs
default_color 000000 #Couleur par défaut
default_shade_color 333333 #Couleur des ombres
default_outline_color black #Couleur des contours
#---
#color1 000000 #Gris foncé
#color2 DDDDDD #Gris clair
#---
short_units yes #Unités courtes
pad_percents 0 #Unité à 2 décimales
color1 333333 # Gris
#color2 006FC0 # Bleu
#color3 8AD749 # Vert
color4 EECE01 # Jaune
color5 F8981F # Orange
#color6 F80E27 # Rouge
color2 3465A4 # Bleu
color3 6FEF22 # Vert
color5 EF7E22 # Orange
color6 BD1B5E # Rouge
minimum_size 385 190
maximum_width 400
TEXT
${exec python /home/julien/.config/openbox/Imagesat.py -c 0x110x1274x657 -r 400x220 -o /tmp/image_sat.jpg -u http://oiswww.eumetsat.org/IPPS/html/latestImages/EUMETSAT_MSG_RGB-naturalcolor-westernEurope.jpg -t 3600}${image /tmp/image_sat.jpg -p -5,-5 -n -s 400x220}
Code : Tout sélectionner
#Fonctionnement de conky
total_run_times 0 #Temps en secondes ; 0 = toujours actif
background yes #Pour que conky tourne en arrière plan ; no = pour les tests
#Mémoire
double_buffer yes #Éviter le clignotement
no_buffers yes #Soustraire les mémoires tampons de la mémoire utilisée
text_buffer_size 1024 #Taille du cache pour le texte
#Affichage
out_to_console no #Affiche le texte sur la sortie standard
update_interval 10 #Taux de rafraîchissement de la fenêtre (s)
#Fenêtre conky
alignment bottom_left #Alignement
#---
gap_x 2 #Écart avec le bord gauche / droit
gap_y 224 #Écart avec le bord haut / bas
#---
draw_shades no #Afficher les ombres
draw_outline no #Afficher les contours de fenêtre
draw_borders yes #Afficher des contours autour des blocs de texte
border_width 2 #Largeur du contour
border_inner_margin 0 #Largeur des marges
#---
own_window yes #Utiliser sa propre fenêtre
# own_window_type override #Type de fenêtre ; normal / override / desktop
# own_window_type normal #Type de fenêtre ; normal / override / desktop
own_window_transparent yes #Pseudo transparence
own_window_hints undecorated,below,sticky,skip_taskbar,skip_pager # définition du type
own_window_class Conky
#Mise en forme
use_xft yes #Utiliser Xft (polices lissées etc)
xftalpha .1 #Utiliser Xft
override_utf8_locale yes #Force l'UTF8
uppercase no #Tout le texte en majuscule
use_spacer right #Ajoute des espaces après certains objets (qu'avec des polices fixes)
#---
xftfont Monospace:size=10 #Police par défaut
#---
default_bar_size 30 3 #Barre par défaut (longeur hauteur)
# stippled_borders 5 #Taille des pointillés
#Couleurs
default_color 000000 #Couleur par défaut
default_shade_color 333333 #Couleur des ombres
default_outline_color black #Couleur des contours
#---
#color1 000000 #Gris foncé
#color2 DDDDDD #Gris clair
#---
short_units yes #Unités courtes
pad_percents 0 #Unité à 2 décimales
color1 333333 # Gris
#color2 006FC0 # Bleu
#color3 8AD749 # Vert
color4 EECE01 # Jaune
color5 F8981F # Orange
#color6 F80E27 # Rouge
color2 3465A4 # Bleu
color3 6FEF22 # Vert
color5 EF7E22 # Orange
color6 BD1B5E # Rouge
minimum_size 385 190
maximum_width 400
TEXT
${exec /home/julien/.config/openbox/Imagesat.py -c 0x0x960x528 -r 400x219 -o /tmp/image_marine.jpg -p http://marine.meteoconsult.fr/carte/meteo-marine/frontologie_0.php#etiquette -i http://images.meteoconsult.fr/image/mc-france/cartes/frontologie/produits/ -t 3600}${image /tmp/image_marine.jpg -p -5,-5 -n -s 400x219}
Code : Tout sélectionner
#Fonctionnement de conky
total_run_times 0 #Temps en secondes ; 0 = toujours actif
background yes #Pour que conky tourne en arrière plan ; no = pour les tests
#Réglages système
cpu_avg_samples 1 #Nb d'échantillons pour calculer la moyenne d'utilisation CPU
net_avg_samples 2 #Nb d'échantillons pour calculer la moyenne d'utilisation CPU
#Mémoire
double_buffer yes #Éviter le clignotement
no_buffers yes #Soustraire les mémoires tampons de la mémoire utilisée
text_buffer_size 1024 #Taille du cache pour le texte
#Affichage
out_to_console no #Affiche le texte sur la sortie standard
update_interval 1 #Taux de rafraîchissement de la fenêtre (s)
#Fenêtre conky
alignment bottom_left #Alignement
#---
minimum_size 1440 0 #Taille minimum (px) ; largeur / hauteur
#maximum_width 150 #Largeur maximum (px)
#---
gap_x 5 #Écart avec le bord gauche / droit
gap_y 400 #Écart avec le bord haut / bas
#---
draw_shades no #Afficher les ombres
draw_outline no #Afficher les contours de fenêtre
draw_borders no #Afficher des contours autour des blocs de texte
border_width 1 #Largeur du contour
border_inner_margin 1 #Largeur des marges
#---
own_window yes #Utiliser sa propre fenêtre
own_window_type override #Type de fenêtre ; normal / override / desktop
own_window_transparent yes #Pseudo transparence
# own_window_hints undecorated,below,sticky,skip_taskbar,skip_pager # définition du type
#Mise en forme
use_xft yes #Utiliser Xft (polices lissées etc)
xftalpha .1 #Utiliser Xft
override_utf8_locale yes #Force l'UTF8
uppercase no #Tout le texte en majuscule
use_spacer right #Ajoute des espaces après certains objets (qu'avec des polices fixes)
#---
xftfont Monospace:size=10 #Police par défaut
#---
default_bar_size 30 3 #Barre par défaut (longeur hauteur)
stippled_borders 5 #Taille des pointillés
#Couleurs
default_color FFFFFF #Couleur par défaut
default_shade_color 333333 #Couleur des ombres
default_outline_color black #Couleur des contours
#---
color1 000000 #Gris foncé
color2 DDDDDD #Gris clair
#---
short_units yes #Unités courtes
pad_percents 2 #Unité à 2 décimales
#avoid flicker
double_buffer yes
#own window to run simultanious 2 or more conkys
#own_window_type normal
own_window_hints undecorated,below,sticky,skip_taskbar,skip_pager
xftfont monoalphabet:pixelsize=150
##############################################
# Output
##############################################
TEXT
$alignc[ ${time %H:%M} ]
${voffset -105}${font monoalphabet:size=45}$alignc${time %A %d %B}
Code : Tout sélectionner
${exec python /home/julien/.config/openbox/Imagesat.py -c 99x160x646x648 -r 547x488 -o /tmp/vent.png -u http://meteociel.fr/cartes_obs/vent.png -t 1800}${image /tmp/vent.png -p -5, -5 -n -s 230x200}
Code : Tout sélectionner
${exec python /home/julien/.config/openbox/Imagesat.py -c 99x160x646x648 -r 547x488 -o /tmp/temperature.png -u http://meteociel.fr/cartes_obs/temp.png -t 1800}${image /tmp/temperature.png -p -5, -5 -n -s 230x200}
Il faut procéder comment pour l'avoir en daemon?chipster a écrit :
[edit1] Limite, il faudrait que je transforme mon programme python en daemon au lieu de l'appeler 4x toutes les x secondes
Code : Tout sélectionner
yaourt -S bmpanel2-git bmpanel2-themes
Code : Tout sélectionner
#!/usr/bin/env python
import sys, os, time, atexit
from signal import SIGTERM
class Daemon:
"""
A generic daemon class.
Usage: subclass the Daemon class and override the run() method
"""
def __init__(self, pidfile, stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'):
self.stdin = stdin
self.stdout = stdout
self.stderr = stderr
self.pidfile = pidfile
def daemonize(self):
"""
do the UNIX double-fork magic, see Stevens' "Advanced
Programming in the UNIX Environment" for details (ISBN 0201563177)
http://www.erlenstar.demon.co.uk/unix/faq_2.html#SEC16
"""
try:
pid = os.fork()
if pid > 0:
# exit first parent
sys.exit(0)
except OSError, e:
sys.stderr.write("fork #1 failed: %d (%s)\n" % (e.errno, e.strerror))
sys.exit(1)
# decouple from parent environment
os.chdir("/")
os.setsid()
os.umask(0)
# do second fork
try:
pid = os.fork()
if pid > 0:
# exit from second parent
sys.exit(0)
except OSError, e:
sys.stderr.write("fork #2 failed: %d (%s)\n" % (e.errno, e.strerror))
sys.exit(1)
# redirect standard file descriptors
sys.stdout.flush()
sys.stderr.flush()
si = file(self.stdin, 'r')
so = file(self.stdout, 'a+')
se = file(self.stderr, 'a+', 0)
os.dup2(si.fileno(), sys.stdin.fileno())
os.dup2(so.fileno(), sys.stdout.fileno())
os.dup2(se.fileno(), sys.stderr.fileno())
# write pidfile
atexit.register(self.delpid)
pid = str(os.getpid())
file(self.pidfile,'w+').write("%s\n" % pid)
def delpid(self):
os.remove(self.pidfile)
def start(self):
"""
Start the daemon
"""
# Check for a pidfile to see if the daemon already runs
try:
pf = file(self.pidfile,'r')
pid = int(pf.read().strip())
pf.close()
except IOError:
pid = None
if pid:
message = "pidfile %s already exist. Daemon already running?\n"
sys.stderr.write(message % self.pidfile)
sys.exit(1)
# Start the daemon
self.daemonize()
self.run()
def stop(self):
"""
Stop the daemon
"""
# Get the pid from the pidfile
try:
pf = file(self.pidfile,'r')
pid = int(pf.read().strip())
pf.close()
except IOError:
pid = None
if not pid:
message = "pidfile %s does not exist. Daemon not running?\n"
sys.stderr.write(message % self.pidfile)
return # not an error in a restart
# Try killing the daemon process
try:
while 1:
os.kill(pid, SIGTERM)
time.sleep(0.1)
except OSError, err:
err = str(err)
if err.find("No such process") > 0:
if os.path.exists(self.pidfile):
os.remove(self.pidfile)
else:
print str(err)
sys.exit(1)
def restart(self):
"""
Restart the daemon
"""
self.stop()
self.start()
def run(self):
"""
You should override this method when you subclass Daemon. It will be called after the process has been
daemonized by start() or restart().
"""
Code : Tout sélectionner
#!/usr/bin/env python
#####################
"""
This sample module instantiates a daemon that sends awful notification
it prints "coucou" every 2 seconds with an incremented counter.
"""
#########################################################################
# ADDING VLAM DEPS #
#########################################################################
import sys, os
PATH_TO_DEPENDENCIES =['unix']
if PATH_TO_DEPENDENCIES not in sys.path:
vlam_path = os.environ['VLAM_PYTHON_WKS']
if vlam_path == None:
print "Unable to find ENV variable VLAM_PYTHON_WKS, using current working dir to find dependencies"
vlam_path = "."
for entry in PATH_TO_DEPENDENCIES:
sys.path.append(vlam_path+"/"+entry)
#print 'adding %s to python path' % (vlam_path+"/"+entry)
#########################################################################
# ADDING PYTHON DEPS ANd METHODS #
#########################################################################
import time, shlex, subprocess, unix_cmd_wrapper
from daemon import Daemon
from subprocess import Popen,PIPE
from unix_cmd_wrapper import RunShellCommandWithoutWaiting, RunShellCommandWithPipeline
class MyDaemon(Daemon):
"""
Define a daemon that send "coucou" notifications
"""
def run(self):
counter = 0
while True:
cmd = "notify-send \"coucou %s\"" % (counter)
RunShellCommandWithPipeline(cmd,"awesome-client")
counter = counter +1
time.sleep(2)
if __name__ == "__main__":
"""
Test main methods
"""
daemon = MyDaemon('/tmp/daemon-example.pid',stdout='/tmp/my_stdout',stderr='/tmp/my_stderr')
if len(sys.argv) == 2:
if 'start' == sys.argv[1]:
daemon.start()
elif 'stop' == sys.argv[1]:
daemon.stop()
elif 'restart' == sys.argv[1]:
daemon.restart()
else:
print "Unknown command"
sys.exit(2)
sys.exit(0)
else:
print "usage: %s start|stop|restart" % sys.argv[0]
sys.exit(2)