#1 Le 12/08/2012, à 10:51
- sergeG75018
Vous en pensez quoi?(screenshot automatique)
Bonjour.
Étant au chômage (je ne travail pas dans l'informatique), j'en profite pour me perfectionner en script.
J'ai eu besoin de prendre des captures d'écran d'une manière récurrente toutes les x secondes.
J'ai essayer avec shutter et gnome-screenshooter mais aucun n'avait cette fonction.
J'ai donc fait ce petit script, qui pour moi aux vues de mais connaissances est énorme :-)
Il ce décompose en 3 fichiers.
1: Le script qui lance la procedure. >>Attention il y-a une boucle infinie.<<
2: un script qui tu la boucle infinie et arrête le processus.
3: Étant sous unity, un indicator qui lance le script qui tu le processus.
Je poste car je pense que cela peut être amélioré
Le script principal.
#récupère le PID du script et l'envoit dans un fichier texte pour pouvoir être tué par l'indicator.
echo $$ > pid_du_script
#fenêtre zenity pour donner le délais entre chaque captures.
secondes=$(zenity --entry \
--width 200 \
--height 50 \
--title="Délais" \
--text="Combien de secondes? ") &&
#fenêtre zenity qui permet de choisir le dossier de sauvegarde des captures et lance ou non le processus.
dossiersortie=$(zenity --file-selection \
--title="Choix du dossier" \
--text="Choisissez un dossier." \
--directory)
case $? in
0) #lance l'indicator
./osc.indicator &
#lance xwininfo qui permet en cliquant sur la fenêtre à capturer
#de renvoyer son PID sous la forme 0x000000 necessaire à import.
xwininfo | grep -n id: | cut -d" " -f4 > pid_du_logiciel && #là ça peut être amélioré en créant une variable
id=`cat pid_du_logiciel` #mais faut que je repose un peu mes neurones
#là on lance import dans un boucle infinie
while :
do
import -window "$id" -pause $secondes "$dossiersortie/capture-"$(date +"%d.%m.%y-%H.%M.%S")".png"
done;;
1)
exit 2;;
-1)
exit 1;;
esac
;;
Il peut-être amélioré en y incluant la prise de fullcreens type jeux vidéo mais deux fenêtres zenity ça suffit ( c'est faisable et facile), il faudrait passer par glade et là j'y connais rien.
Le cript qui kill la boucle infinie.
#!/bin/bash
#récupère le PID du script dans le fichier texte.
pid_du_script=`cat pid_du_script`
#tu le script.
kill $pid_du_script &
#supprime les fichiers temporaires
rm pid_du_script pid_du_logiciel
Le script de l'indicator pour unity qui kill le script, il est fait de bric et broc parce que python et moi!
mais je vais m'y mettre, promis.
#!/usr/bin/env python
import gtk
import appindicator
import os
class AppIndicator:
def __init__(self):
self.ind = appindicator.Indicator("autoscreenshoter",
"applets-screenshooter", appindicator.CATEGORY_APPLICATION_STATUS)
self.ind.set_status (appindicator.STATUS_ACTIVE)
self.menu = gtk.Menu()
item = gtk.MenuItem("Quitter")
item.connect("activate", self.quit)
self.menu.append(item)
self.menu.show_all()
self.ind.set_menu(self.menu)
def quit(self, *args):
os.system("./killscript")
gtk.main_quit()
AppIndicator()
gtk.main()
Voilà dites moi si j'ai fais des erreurs cela me permettra d'évoluer.
merci et bonne journée.
Ironie, sarcasme ou cynisme? Je ne sais plus
Hors ligne
#2 Le 12/08/2012, à 22:25
- papy88140
Re : Vous en pensez quoi?(screenshot automatique)
Le plus simple serait de tout intégrer dans le script python
D'autant plus que la librairie glib intègre des fonctions de timer !
J'ai eu la même chose à faire pour un programme qui change le papier peint du bureau à intervalle régulier.
Le code est pas non plus super propre mais il peut donner des idées [ pas de meurtre j'espère ]
Voila :
#!/usr/bin/python
# -*- coding: utf-8 -*-
# codé par Papy - Fabrice PIERROT
# ce code est placé sous licence GPL 2
# http://www.linux-france.org/article/these/gpl.html
#
# version 13-04-2012
#
import pygtk
pygtk.require('2.0')
import gtk,os,string,subprocess
import urllib2,random,time,datetime
import string,re,hashlib,glib
import appindicator
from gtkforms import *
# http://images.alphacoders.com/158/
class wallbaseConfig:
def __init__(self):
self.tags = ""
self.anime = ""
self.model =""
self.purity = ""
class papyWpTray:
def startCronWp(self):
print "Start"
self.cron=True
self.changeWp()
self.callback=glib.timeout_add_seconds(15,self.changeWp)
def stopCronWp(self):
print "stop"
self.cron=False
glib.source_remove(self.callback)
self.callback=0
def cronWp(self, widget):
if widget.active:
self.startCronWp()
else:
self.stopCronWp()
def saveWp(self, widget):
md5=open("%s/.papyWp.md5" % (self.homeDir)).readline()
pictureOrg =open("%s/.papyWp.jpg" % (self.homeDir)).read()
pictureCopy = open("%s/papyWp_%s.jpg" % (self.pictureDir,md5),"w").write(pictureOrg)
# notification de la sauvegarde
def nextWp(self, widget):
if self.callback > 0 :
glib.source_remove(self.callback)
self.changeWp()
if self.callback > 0 :
self.callback=glib.timeout_add_seconds(15,self.changeWp)
def quit(self, widget):
gtk.main_quit()
def popup_menu(self, widget, button, time, data = None):
if button == 3:
if data:
data.show_all()
data.popup(None, None, gtk.status_icon_position_menu,
3, time, self.statusIcon)
# code issu du site http://stackoverflow.com/questions/3431825/python-generating-a-md5-checksum-of-a-file
def hashfile(self, afile, hasher, blocksize=65536):
buf = afile.read(blocksize)
while len(buf) > 0:
hasher.update(buf)
buf = afile.read(blocksize)
return hasher.hexdigest()
# fin du code
def changeWp(self):
print "change WP from %s for %s with callback %s" % (self.repository,self.shell,self.callback)
my_picture=self.loader[self.repository]()
filenamePicture = "%s/.papyWp.jpg" % (self.homeDir)
filenameMd5 = "%s/.papyWp.md5" % (self.homeDir)
try:
filePicture = open(filenamePicture, "wb")
filePicture.write(my_picture)
filePicture.close()
md5=self.hashfile(file(filenamePicture,'r'),hashlib.md5())
fileMd5 = open(filenameMd5, "wb")
fileMd5.write(md5)
fileMd5.close()
except:
pass
return(self.cron)
# --- code issu du site : http://stackoverflow.com/questions/553303/generate-a-random-date-between-two-other-dates
def strTimeProp(self, start, end, format, prop):
stime = time.mktime(time.strptime(start, format))
etime = time.mktime(time.strptime(end, format))
ptime = stime + prop * (etime - stime)
return time.strftime(format, time.localtime(ptime))
def randomDate(self, start, end, prop):
return self.strTimeProp(start, end, '%Y/%m/%d', prop)
# --- fin du code
def flickr(self):
opener = urllib2.build_opener()
reLien = re.compile("<a href=[^>]*>")
rePhoto = re.compile("""\"/photos/[^\"^/]*/[^\"^/]*/\"""")
reUrl1 = re.compile("""url: \'[^\']*_b.jpg\'""")
reUrl2 = re.compile("""url: \'[^\']*_z.jpg\'""")
reUrl3 = re.compile("""url: \'[^\']*.jpg\'""")
try:
page = opener.open("http://www.flickr.com/explore/interesting/%s/page%02i/" % (self.randomDate("2010/01/01", "2011/07/27", random.random()),random.randint(1,6)))
html = page.read()
page.close()
photos=rePhoto.findall(html)
index=random.randint(1, len(photos)-1)
page=opener.open("http://www.flickr.com%s" % (photos[index][1:len(photos[index])-1]))
html=page.read()
except:
print "retry"
return self.flickr()
adrPhoto=reUrl1.findall(html)
if len(adrPhoto) == 0 :
adrPhoto=reUrl2.findall(html)
if len(adrPhoto) == 0 :
adrPhoto=reUrl3.findall(html)
try:
adrPhoto=adrPhoto[len(adrPhoto)-1][6:-1]
page = opener.open(adrPhoto)
my_picture = page.read()
page.close()
except:
print "retry"
return self.flickr()
return my_picture
def wallbase(self):
opener = urllib2.build_opener()
motif=re.compile("""<a href="http://wallbase.cc/wallpaper/[^\"]*""")
motif2=re.compile("""img src=\"http://[^\"]*.jpg""")
while len(self.wallbaseListe) == 0 :
print "lecture liste"
try:
page = opener.open("http://wallbase.cc/search","query=%s&board=2&nsfw=%s%s%s&res=0x0&res_opt=eqeq&aspect=%s&orderby=random&orderby_opt=desc&thpp=60§ion=wallpapers" % (self.wallbaseConfig.tags,self.wallbaseConfig.anime,self.wallbaseConfig.model,self.wallbaseConfig.purity,self.ratio))
html=page.read()
page.close()
self.wallbaseListe = motif.findall(html)
except:
print "retry"
print len(self.wallbaseListe)
url=self.wallbaseListe[random.randint(0,len(self.wallbaseListe)-1)]
pic_urls = []
while len(pic_urls) == 0 :
try :
page = opener.open(url[9:])
html=page.read()
page.close()
pic_urls=motif2.findall(html)
pic_url=pic_urls[0][9:]
my_picture = opener.open(pic_url).read()
self.wallbaseListe.remove(url)
return my_picture
except :
print "retry"
self.wallbaseListe.remove(url)
return self.wallbase()
def _500px(self):
opener = urllib2.build_opener()
motif=re.compile("""http://pcdn.500px.net/[^\"]*4.jpg\"""")
number = random.randint(1,6000000)
try:
page = opener.open("http://500px.com/photo/%s" % (number))
html=page.read()
page.close()
my_picture = opener.open(motif.findall(html)[0][:-1]).read()
return my_picture
except:
print "retry"
return self._500px()
def setFlickr(self,widget):
self.label_500px.set_text("500px")
self.label_flickr.set_text("--> flickr")
self.label_wallbase.set_text("Wallbase")
self.repository="flickr"
def setWallbase(self,widget):
self.label_500px.set_text("500px")
self.label_flickr.set_text("flickr")
self.label_wallbase.set_text("--> Wallbase")
self.repository="wallbase"
def set500px(self,widget):
self.label_500px.set_text("--> 500px")
self.label_flickr.set_text("flickr")
self.label_wallbase.set_text("Wallbase")
self.repository="500px"
def configuration(self,widget):
create_gtk_dialog_from_object(self.wallbaseConfig).run()
self.wallbaseListe=[]
def __init__(self):
# Définition des variables
self.homeDir = os.path.expanduser("~")
dirs=open("%s/.config/user-dirs.dirs" % (self.homeDir)).readlines()
for ligne in dirs:
if ligne[4:12] == "PICTURES" :
self.pictureDir = string.replace(ligne[18:-2],"$HOME",os.path.expanduser("~"))
self.cron=False
self.callback=0
self.loader={}
self.loader["flickr"]=self.flickr
self.loader["wallbase"]=self.wallbase
self.loader["500px"]=self._500px
self.repository="flickr"
self.wallbaseConfig = wallbaseConfig()
self.wallbaseListe = []
self.wallbaseConfig.tags = ""
self.wallbaseConfig.anime = "0"
self.wallbaseConfig.model = "0"
self.wallbaseConfig.purity = "0"
# détection de la résolution de l'écran
p1 = subprocess.Popen(args=["xrandr"],stdout=subprocess.PIPE)
p2 = subprocess.Popen(args=["grep",'*'],stdin=p1.stdout,stdout=subprocess.PIPE)
p1.stdout.close()
self.resolution = p2.communicate()[0].split()[0]
p2.stdout.close()
self.resolution_x,self.resolution_y = self.resolution.split("x")
self.ratio=str(float(self.resolution_x)/int(self.resolution_y))[0:4]
print self.ratio
out,err = subprocess.Popen(args=["ps","-C","unity-panel-service"],stdout=subprocess.PIPE).communicate()
# détection du shell graphique
if string.find(out,"unity") >0 :
self.shell="Unity"
else :
self.shell="Unity" # gnome
print self.shell
# initialisation du format du fond d'écran
filenamePicture = "%s/.papyWp.jpg" % (self.homeDir)
if self.shell == "Unity" :
subprocess.Popen(args=["gsettings","set","org.gnome.desktop.background","picture-uri","file://%s"%(filenamePicture)])
subprocess.Popen(args=["gsettings","set","org.gnome.desktop.background","picture-options","scaled"])
else :
subprocess.Popen(args=["gconftool-2","--type=string","--set","/desktop/gnome/background/picture_filename","%s"%(filenamePicture)])
subprocess.Popen(args=["gconftool-2","--type=string","--set","/desktop/gnome/background/picture_options","scaled"])
subprocess.Popen(args=["gconftool-2","--type=string","--set","/desktop/gnome/background/primary_color","#000000000000"])
# création de l'application systray
if self.shell == "Gnome" :
self.app = gtk.StatusIcon()
try :
open("%s/wpIcon.svg"%(self.homeDir))
self.app.set_from_file("%s/wpIcon.svg"%(self.homeDir))
except :
self.app.set_from_stock(gtk.STOCK_ABOUT)
else :
self.app = appindicator.Indicator("PapyWallpaperTray","applications-system", appindicator.CATEGORY_OTHER)
self.app.set_status(appindicator.STATUS_ACTIVE)
try :
open("%s/wpIcon.svg"%(self.homeDir))
self.app.set_icon("%s/wpIcon.svg"%(self.homeDir))
except :
pass
# définition du menu
self.menu = gtk.Menu()
self.menuItem_roll = gtk.CheckMenuItem("Tournant")
self.menuItem_roll.connect('activate', self.cronWp)
self.menu.append(self.menuItem_roll)
self.menuItem_save = gtk.ImageMenuItem(gtk.STOCK_SAVE)
self.menuItem_save.connect('activate', self.saveWp)
self.menu.append(self.menuItem_save)
self.menuItem_next = gtk.ImageMenuItem(gtk.STOCK_GO_FORWARD)
self.menuItem_next.connect('activate', self.nextWp)
self.menu.append(self.menuItem_next)
self.menu.append(gtk.SeparatorMenuItem())
self.menuItem_flickr = gtk.MenuItem()
self.label_flickr = gtk.Label("--> Flickr")
self.menuItem_flickr.add(self.label_flickr)
self.menuItem_flickr.connect('activate', self.setFlickr)
self.menu.append(self.menuItem_flickr)
self.menuItem_wallbase = gtk.MenuItem()
self.label_wallbase = gtk.Label("Wallbase")
self.menuItem_wallbase.add(self.label_wallbase)
self.menuItem_wallbase.connect('activate', self.setWallbase)
self.menu.append(self.menuItem_wallbase)
self.menuItem_500px = gtk.MenuItem()
self.label_500px = gtk.Label("500px")
self.menuItem_500px.add(self.label_500px)
self.menuItem_500px.connect('activate', self.set500px)
self.menu.append(self.menuItem_500px)
self.menu.append(gtk.SeparatorMenuItem())
self.menuItem_config = gtk.ImageMenuItem(gtk.STOCK_PREFERENCES)
self.menuItem_config.connect('activate', self.configuration)
self.menu.append(self.menuItem_config)
self.menu.append(gtk.SeparatorMenuItem())
self.menuItem_quit = gtk.ImageMenuItem(gtk.STOCK_QUIT)
self.menuItem_quit.connect('activate', self.quit)
self.menu.append(self.menuItem_quit)
self.menu.show_all()
# intégration du menu à l'appli
if self.shell == "Gnome" :
self.app.set_visible(True)
self.app.set_tooltip("PapyWallpaperTray")
self.app.connect('popup-menu', self.popup_menu, self.menu)
self.app.set_visible(1)
else :
self.menu.show()
self.app.set_menu(self.menu)
if __name__ == "__main__":
papyWpTray = papyWpTray()
gtk.main()
Linux à Contrexéville ?
http://leclug.free.fr/forum/
Hors ligne
#3 Le 13/08/2012, à 11:16
- sergeG75018
Re : Vous en pensez quoi?(screenshot automatique)
bonjour.
Pour l'instant je suis sur bash, pour python on verra plus tard.
Je me rends compte que je me suis pris la tête pour pas grand chose car un simple
set -e
résolvait mon problème de boucle infini et de fait rendait inutile l'utilisation d'un indicator et d'un script pour arrêter la boucle.
merci.
#!/bin/bash
#necessite zenity, xwininfo et import (outil d'imagemagick) qui sont je crois de base dans ubuntu.
#Arrêter le script en cas d'erreur. À la fermeture de la fenêtre capturée import va générer une
#erreur et donc le script va s'arrêter
set -e
#fenêtre zenity pour donner le délais entre chaque captures.
secondes=$(zenity --entry \
--width 200 \
--height 50 \
--title="Délais" \
--text="Combien de secondes? ") &&
#fenêtre zenity qui permet de choisir le dossier de sauvegarde des captures et lance ou non le processus.
dossiersortie=$(zenity --file-selection \
--width 500 \
--height 450 \
--title="Choix du dossier" \
--text="Choisissez un dossier." \
--directory)
case $? in
0)
#lance xwininfo qui permet en cliquant sur la fenêtre à capturer
#de renvoyer son PID sous la forme 0x000000 necessaire à import.
id=`xwininfo | grep -n id: | cut -d" " -f4`
#là on lance import dans un boucle infinie
while :
do
import -window "$id" -pause $secondes "$dossiersortie/capture-"$(date +"%d.%m.%y-%H.%M.%S")".png"
done;;
1)
exit 2;;
-1)
exit 1;;
esac
;;
edit: j'ai juste rajouter la variable pour xwininfo
id=`xwininfo | grep -n id: | cut -d" " -f4`
Dernière modification par sergeG75018 (Le 13/08/2012, à 11:30)
Ironie, sarcasme ou cynisme? Je ne sais plus
Hors ligne