Bonne utilisation de la progress bar [résolu]

Pour tous ceux qui veulent aller plus plus dans les aspects techniques de Gimp.

Modérateur : Ze Techos

Répondre
moths-art
Wilber en peluche
Messages : 8
Inscription : 04 oct. 2011, 13:14

Bonne utilisation de la progress bar [résolu]

Message par moths-art »

Bonjour,

J'aide actuellement le projet Plee-the-bear : http://plee-the-bear.sourceforge.net/index-fr.html surtout au niveau graphique. (ça manque de graphiste, ceci dit en passant!)

Pour automatiser certaines taches, plusieurs plugins python ont été mis en place.(ainsi que scheme mais c'est moins ma tasse de thé)

Dans mon dernier script, j'ai vraiment un problème sur la progress bar.
Vu qu'il y a plusieurs traitements sur un ensemble d'images, je voulais une progress bar générique qui m'affiche exactement le nombre d'images traités et restantes.

Dans l'état actuelle des choses, gimp à chaque traitement, va afficher la progress bar.
Du coup, si on a 10 images à traité, la barre passe de 0 à 1 dix fois!

Voici mon premier test :

Code : Tout sélectionner

progress_inc = 1/float(len(list_des_images))
gimp.progress_update(inc*progress_inc)
pdb.gimp_progress_set_text('Processing sprite "'+nom_du_sprite+'" n°'+str(inc))
Le résultat est à moitié fait : la barre se déplace bien à la vitesse escompté mais elle est à peine visible.
En effet, chaque traitement d'image va écraser ma barre pour afficher sa barre de progression!
Est-il possible de masquer ces traitements intermédiaires?

Enfin, est-il possible de récupérer le pourcentage de traitement de images. (exemple : pdb.gimp_file_save)
En effet, si j'applique mon traitement sur 9 images de 3ko et 1 de 1Mo... la barre de progression risque d'être légèrement incohérente!
Dernière modification par moths-art le 05 oct. 2011, 11:42, modifié 1 fois.

moths-art
Wilber en peluche
Messages : 8
Inscription : 04 oct. 2011, 13:14

Re: Bonne utilisation de la progress bar

Message par moths-art »

Bon, et bien je crois avoir trouvé par moi même.
Vu que j'ai dût cumuler parcours des sources de gimp, pérégrination de l'api de gimp et de recherches sur le web, je vais vous donner ma méthode :

Code : Tout sélectionner

bar_progress = gimpui.ProgressBar() #gtk.ProgressBar() devrait fonctionner également
dialog.vbox.hbox2.pack_end(bar_progress, True, True, 5)
bar_progress.show()

procedure = gimp.progress_install(start_progress, end_progress,\
text_progress, value_progress)
.
.
.
pdb.gimp_progress_uninstall(procedure)
Ceci à mettre dans le main de votre plugin :
la procédure créé doit englober l'ensemble des appels de la progress bar principal afin de les intercepter et de les rendre muet dans un premier temps.

Elle appel pour cela 4 fonctions de rappel (callback) que j'ai défini pour l'occasion comme ceci :

Code : Tout sélectionner

def start_progress(message, cancelable):
   bar_progress.set_text(_('Processing sprite %s  n° %i') % (sprite_name, inc))
   bar_progress.set_fraction(progress)
   while gtk.events_pending():
      gtk.main_iteration()
def end_progress():
    pass
def text_progress(message):
    print message
def value_progress(value):
    print value
Dans cet exemple, j'intercepte chaque appel à la progress bar de gimp dans "start_progress" dans un premier temps et je fais varier la progress bar de mon plugin en fonction.
Bien sur, les variables sprite_name, inc et progress sont défini dans ma méthode main.
sprite_name étant le nom des fichiers enregistrés, inc le numéro de celui-ci (le 4ème par exemple) et progress une valeur calculé entre 0 et 1. (si c'est la 2 ème image sur 3, il sera à 0.66)

la partie :

Code : Tout sélectionner

   while gtk.events_pending():
      gtk.main_iteration()
me permet de rafraichir la fenêtre lorsque la progress bar est modifié.
Je ne sais pas si c'est la solution idéale, ma connaissance de gtk étant limité.
Je peux simplement dire qu'il ne faut pas en abuser car ça risquerai de ralentir profondément le script.

Enfin, il est possible d'intercepter soigneusement les textes et valeurs envoyés à la progress bar de gimp dans
"text_progress" et "value_progress" et de les réadapter selon ses besoins.

Voilà, j'espère avoir été clair et en aider plus d'un. :wboeillangue:

Répondre