Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Rafraichir un bitmap à l'écran

8 réponses
Avatar
al
Bonjour à tous,

c'est mon premier post sur ce forum, et je suis plutôt jeune en Python, et
assez vieux en programmation ;-). Je dois avouer que ce langage me plait
beaucoup, par sa concision, sa clarté et surtout son élégance (J'avoue
cependant que si Python était le premier langage à reprendre l'idée de mon
ami Canarlake, ce ne serait pour me déplaire :
http://canarlake.org/index.cgi?theme=liberezexpressions )

Venons en à mon problème :
J'ai créé un bitmap avec Image.new, que je manipule avec des getpixel /
putpixel. Pour l'afficher à l'écran, je crée un ImageTk.PhotoImage, que que
je place ensuite dans un create_image d'un Canvas (TkInter).

Ma question est : comment rafraîchir l'écran à chaque fois que je fais des
opération dans le bitmap. Je pensais que c'était une liaison dynamique, pas
du tout. J'ai cherché dans Google, je n'ai rien trouvé de probant.

J'en suis donc réduit à détruire le create_image par un Canvas.delete, puis
à le recréer ! C'est pas optimum et je pense qu'il y a moyen de faire mieux
et plus simple (j'ai cherché un méthode de type CopyPixels, redraw, BitBlt,
etc... sans succès).

Merci de vos lumières.

8 réponses

Avatar
Jerome
al wrote:
Bonjour à tous,


Bonjour


c'est mon premier post sur ce forum, et je suis plutôt jeune en Python, et
assez vieux en programmation ;-). Je dois avouer que ce langage me plait
beaucoup, par sa concision, sa clarté et surtout son élégance (J'avoue
cependant que si Python était le premier langage à reprendre l'idée de mon
ami Canarlake, ce ne serait pour me déplaire :
http://canarlake.org/index.cgi?theme=liberezexpressions )


Je ne suis pas complètement convaincu par la démonstration de ton ami,
c'est à mon sens plus une solution pratique pour détourner la
philosophie objet du langage avec une syntaxe fonctionnelle.

Qu'est-ce qui empêche d'écrire nab = (a-b).norme() plutôt que de se
forcer à rajouter une syntaxe comme nab = (b-a).(sqrt(self.x**2 +
self.y**2 + self.z**2)) ? La création d'une classe implique
nécessairement une volonté de factorisation du code et du comportement
d'un objet.


Venons en à mon problème :
J'ai créé un bitmap avec Image.new, que je manipule avec des getpixel /
putpixel. Pour l'afficher à l'écran, je crée un ImageTk.PhotoImage, que que
je place ensuite dans un create_image d'un Canvas (TkInter).

Ma question est : comment rafraîchir l'écran à chaque fois que je fais des
opération dans le bitmap. Je pensais que c'était une liaison dynamique, pas
du tout. J'ai cherché dans Google, je n'ai rien trouvé de probant.

J'en suis donc réduit à détruire le create_image par un Canvas.delete, puis
à le recréer ! C'est pas optimum et je pense qu'il y a moyen de faire mieux
et plus simple (j'ai cherché un méthode de type CopyPixels, redraw, BitBlt,
etc... sans succès).


Ce sont des fonctions qui sont disponibles avec wxPython que je trouve
personnellement plus performante et plus puissante que TkInter. Pour ton
problème, as-tu essayé de dessiner avec l'équivalent du putpixel pour
les canvas TkInter lorsque tu modifies ton image ?


Merci de vos lumières.




Avatar
al
Ce sont des fonctions qui sont disponibles avec wxPython que je trouve
personnellement plus performante et plus puissante que TkInter. Pour ton
problème, as-tu essayé de dessiner avec l'équivalent du putpixel pour
les canvas TkInter lorsque tu modifies ton image ?


Pour l'instant je suis en phase d'apprentissage, petit bout par petit bout !
L'aspect Tk étant relativement laid (du moins sous Linux), je compte bien
passer plus tard à wxPython, Qt ou GTK !!!

Pour dessiner directement sur un canvas le seul équivalent que je voie est
create_rectangle, mais c'est beaucoup plus lent (et il me manque le
getpixel), car ça crée un objet à chaque fois, alors que là je veux juste
faire de la manipulation brute de pixels. Pensait tu à une autre méthode de
canvas que je n'aurai pas vu ?

Avatar
Jerome
al wrote:
Ce sont des fonctions qui sont disponibles avec wxPython que je trouve
personnellement plus performante et plus puissante que TkInter. Pour ton
problème, as-tu essayé de dessiner avec l'équivalent du putpixel pour
les canvas TkInter lorsque tu modifies ton image ?


Pour l'instant je suis en phase d'apprentissage, petit bout par petit bout !
L'aspect Tk étant relativement laid (du moins sous Linux), je compte bien
passer plus tard à wxPython, Qt ou GTK !!!


Tu gagneras du temps à passer directement à une librairie plus évoluée


Pour dessiner directement sur un canvas le seul équivalent que je voie est
create_rectangle, mais c'est beaucoup plus lent (et il me manque le
getpixel), car ça crée un objet à chaque fois, alors que là je veux juste
faire de la manipulation brute de pixels. Pensait tu à une autre méthode de
canvas que je n'aurai pas vu ?


Non, je n'ai jamais essayé de pousser TkInter pour voir ses
possibilités, je me suis arrêté à l'aspect "interface des années 80"
avant de considérer les autres. En lisant la doc j'aurais tenté le
create_rectangle aussi. En parcourant rapidement la doc je ne pense pas
qu'il existe une autre solution que ce que tu fais actuellement.


Avatar
al
Jerome wrote:

Tu gagneras du temps à passer directement à une librairie plus évoluée


Merci du conseil, étant fan de KDE je tenterai Qt

Non, je n'ai jamais essayé de pousser TkInter pour voir ses
possibilités, je me suis arrêté à l'aspect "interface des années 80"
avant de considérer les autres. En lisant la doc j'aurais tenté le
create_rectangle aussi. En parcourant rapidement la doc je ne pense pas
qu'il existe une autre solution que ce que tu fais actuellement.


Merci, de toute façon c'est juste ma phase d'apprentissage, si je fais de
plus gros projets j'utiliserai d'autres librairies.
Concernant le look années 80, ça peut avoir son charme vintage "station de
travail sun" avec un thème Motif... ;-)

Avatar
JB BUTET
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Salut :)

(snip)

il faut que ton image soit déclarées en variable globale... ou mieux :

tu fais un dico (qui peut contenir des objets) :
dic["image"] = monobjetimage

et ça permet de garder l'image.

Pour la rafraichir après changement, il y a une fonctione update() (je
te laisse chercher, ce mot clef est le bon)

A+

JB


-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.7 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFGsxBDetOZWwsO2AERArDZAKCFfFOO6Ux5IgYSsPIbRQfN3a04lwCgowR/
4PAt0Zh2P1pDlem2rhkDY5E =oseI
-----END PGP SIGNATURE-----
Avatar
Eric Brunel
On Fri, 03 Aug 2007 11:34:36 +0200, Jerome wrote:
Pour ton problème, as-tu essayé de dessiner avec l'équivalent du
putpixel pour les canvas TkInter lorsque tu modifies ton image ?


Juste pour apporter une précision: il n'y a pas de putpixel sur les Canvas
Tkinter, et il n'y a pas de getpixel non plus. Un Canvas Tkinter est un
module de dessin *vectoriel*, et pas bitmap. Ceci permet par exemple de
faire:

r = monCanvas.create_rectangle(50, 50, 100, 100)

puis plus tard:

monCanvas.coords(r, 40, 30, 80, 150)

La variable r identifie un objet rectangle, que l'on manipule comme un
rectangle, et pas comme un ensemble de points. Ce qui n'est pas possible,
par contre, c'est de créer un rectangle, puis d'enlever des pixels dedans.

Le Canvas Tkinter est donc très utile pour faire des applis de dessin
vectoriel, et très em...bêtant pour faire du bitmap. En d'autres termes,
on est plus près d'Illustrator que de Photoshop.
--
python -c "print ''.join([chr(154 - ord(c)) for c in
'U(17zX(%,5.zmz5(17l8(%,5.Z*(93-965$l7+-'])"

Avatar
al
Eric Brunel wrote:

Le Canvas Tkinter est donc très utile pour faire des applis de dessin
vectoriel, et très em...bêtant pour faire du bitmap. En d'autres termes,
on est plus près d'Illustrator que de Photoshop.


C'est exactement ça, le Canvas manipule des sous-objets vectoriel, alors que
ce que je veux c'est rafraîchir un bitmap à l'écran.

Avatar
al
JB BUTET wrote:

Pour la rafraichir après changement, il y a une fonctione update() (je
te laisse chercher, ce mot clef est le bon)


Merci pour cette piste, j'avais déjà essayé mais dans mon cas, comme le
laissait deviner la doc, ça ne fait rien (et tous mes bitmaps sont bien
globales puisque j'interviens dessus plusieurs fois).

Par contre j'ai trouvé une piste un peu plus propre que mes delete / create
sauvages :
1 - Il faut dans tous les cas recréer le PhotoImage à partir du bitmap
2 - Utiliser la méthode Canvas.itemconfigure(idImage, image=ref au
PhotoImage précédent)