OVH Cloud OVH Cloud

Tkinter et la gestion des images

2 réponses
Avatar
Elby
Je suis en train de faire une petite application graphique pour traiter
les images présentes dans un répertoire, et je dois mettre un aperçu de
mon image dans mon application. Ces images peuvent être de plusieurs
types différents.

Voici le code que j'utilise pour l'instant pour mettre à jour mes images :
from Tkinter import *
from ImageTk import *
import Image

root = Tk()
file = self.file_list.pop()
im = Image.open(self.file1)
im.resize(new_size)
pic = PhotoImage(im)
canvas = Canvas(root,width=L, height=H, bg='white')
canvas.create_image(L/2, H/2,image=pic)
canvas.grid()

Je n'ai pas trouvé de méthode pour mettre à jour un canevas ou effacer
son contenu donc pour l'instant je recrée canvas à chaque changement
d'images. Cette méthode marche mais n'est absolument pas efficace.
Pour les images avec un canal alpha, cela prend bcp de temps.

De plus j'aimerais précharger l'image suivante pour que le changement
d'image soit presque instantanné mais je ne sais pas comment faire. des
idées ?

Par ailleurs, j'ai voulu tester wxpython mais je n'ai pas encore trouvé
de didacticiel. Pourriez vous m'en conseiller quelques-uns ?

Merci d'avance.

Elby

2 réponses

Avatar
Gilles Lenfant

[...]


Par ailleurs, j'ai voulu tester wxpython mais je n'ai pas encore trouvé
de didacticiel. Pourriez vous m'en conseiller quelques-uns ?


En disant "wxpython tutorial" à google, il m'a répondu (entre autres)...

http://www.wxpython.org/tutorial.php

http://www-106.ibm.com/developerworks/library/l-wxpy/index.html

Et tout plein d'autres...



Merci d'avance.


Welcome


Elby


Avatar
Eric Brunel
Elby wrote:
Je suis en train de faire une petite application graphique pour traiter
les images présentes dans un répertoire, et je dois mettre un aperçu de
mon image dans mon application. Ces images peuvent être de plusieurs
types différents.

Voici le code que j'utilise pour l'instant pour mettre à jour mes images :
from Tkinter import *
from ImageTk import *
import Image

root = Tk()
file = self.file_list.pop()
im = Image.open(self.file1)
im.resize(new_size)
pic = PhotoImage(im)
canvas = Canvas(root,width=L, height=H, bg='white')
canvas.create_image(L/2, H/2,image=pic)
canvas.grid()

Je n'ai pas trouvé de méthode pour mettre à jour un canevas ou effacer
son contenu donc pour l'instant je recrée canvas à chaque changement
d'images. Cette méthode marche mais n'est absolument pas efficace.
Pour les images avec un canal alpha, cela prend bcp de temps.


Chaque élément créé dans un Canvas a un identificateur que tu peux utiliser par
la suite pour le virer:

imgId = canvas.create_image(L/2, W/2, image=pic)
# ...
canvas.delete(imgId)

Si tu veux tout virer, le pseudo-id ALL te permet de la faire avec:

canvas.delete(ALL)

De plus j'aimerais précharger l'image suivante pour que le changement
d'image soit presque instantanné mais je ne sais pas comment faire. des
idées ?


J'ai peur que pour faire ça, tu ne puisses pas échapper à un thread secondaire,
qui lirait les images pendant que le thread principal les affiche. Je n'ai
jamais testé et je ne sais pas si ça peux marcher (Tkinter est généralement un
peu faché avec les threads...). Si je devais le faire, je ferais donc un thread
secondaire qui parcourt les fichiers image, crée les instance de Image
correspondantes et mets par exemple un couple (nom du fichier, instance de
Image) dans une Queue. Le thread principal lit une première fois la Queue pour
récupérer la première image, puis la re-lit à chaque fois qu'on clique le bouton
Next par exemple. Je répète: je n'ai pas essayé, donc ça peut ne pas marcher...

HTH quand meme...
--
- Eric Brunel <eric (underscore) brunel (at) despammed (dot) com> -
PragmaDev : Real Time Software Development Tools - http://www.pragmadev.com