Bonjour,
je veux afficher une image dans un canevas et je voudrais qu'elle soit redimensionnée pour coller à la taille du canevas. J'utilise PIL et PhotoImage. Est ce que vous pouvez m'aider?
Merci!
Bonjour,
je veux afficher une image dans un canevas et je voudrais qu'elle soit redimensionnée pour coller à la taille du canevas. J'utilise PIL et PhotoImage. Est ce que vous pouvez m'aider?
Merci!
Salut, voici un lien qui pourra d'aider.
http://python.developpez.com/faq/?page=Canvas
Faites des tests
![]()
J'ai testé et il me dit :
File "main.py", line 16, in imgaffiche
img = Image.open(imgfile1)
AttributeError: class Image has no attribute 'open'
Pourtant j'ai bien importé Image de PIL
non, j'ai ça:
Mais je ne touche pas au nom des modules
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 from PIL import Image, ImageTk ... ... img = Image.open(imgfile1) #imgfile1 contient le nom du fichier biensur photo = ImageTk.PhotoImage(image) can.create_image(0,0, anchor = NW, image=photo)
Justement, vérifie qu'entre les lignes que tu as donné tu n'as pas défini autre chose nommé Image. Tu peux aussi essayer
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 print dir(Image) #affiche la liste des méthodes disponibles print Image.__file__ #affiche le nom du fichier contenant l'objet Image
open est bien dans la liste des méthode.
L'aide sur Image.open me dit:
Help on function open in module PIL.Image:
open(fp, mode='r')
Open an image file, without loading the raster data
J'ai donc essayer avec l'option 'r' mais ça ne change rien.
La variable __file__ contient C:\Python25\lib\site-packages\PIL\Image.pyc. Il faut le changer? (je ne sais pas à quoi ça correspond)
j'ai remarqué une erreur d'après l'exemple.
Dans ce code tu ouvre ton image virtuellement.
Ensuite, tu le mets dans ta fenêtre. Mais tu n'a pas mis correctement la variable.
tu devrais mettre img et non image :
J'espère que cela résoudra ton problème.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 photo = ImageTk.PhotoImage(img)
![]()
merci!
cette boulette est corrigée mais le soucis n'était même pas arrivé jusque là puisqu'il plante sur l'instruction précédente. Il n'aime vraiment pas le open...
Bon, après relecture du message d'erreur, l'interpréteur signale que tu disposes d'une classe nommée Image, ce qui interfère avec le module. Les variables que j'ai voulu que tu affiches, c'était dans ton code, histoire de voir si quelque chose interfère. Et effectivement tu sembles avoir une classe nommée Image, rendant le module Image inaccessible.
Là aussi tu as mis un variable incorrect:
il devrai être :
Bonne chance
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 can.create_image(0,0, anchor = NW, img=photo)![]()
Je n'utilise plus Tkinter depuis un petit moment mais lorsque je rencontre un problème qui ressemble un peu au tien (à savoir utilisation d'un bout de code de la faq, et utilisation non concluante...), je repars depuis le début.
Le lien que Petugnia t'as donné fonctionne. Lance le dans le même répertoire que celui où tu as ta photo et procède à une personnalisation pas à pas...
Tu tombera bien à un moment ou à un autre sur ce qui te bloque.
Bon courage![]()
Initiation à Qt Quick et QML : Partie 1 - Partie 2
En cas de besoin, pensez à la
Mon site et mes tutoriaux sur Developpez.com
Pas de question technique par MP... Les forums sont là pour ça
J'ai trouvé mais je reste une quiche!(l'honneur est sauf!)
En fait, quand j'appelais Image.open(...), il cherchait la fonction open dans la classe Image, mais comme j'ai importé spécifiquement Image, il suffisait de mettre open(...). De même, il fallait virer ImageTk dans ImageTk.PhotoImage(...).
La partie qui fait de moi une quiche, c'est que ça marche toujours pas! (bah oui ça aurait été trop beau...) J'ai donc droit à cette erreur:
Et là je comprend rien, sauf qu'il aime pas le create_image.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 Exception in Tkinter callback Exception exceptions.AttributeError: "PhotoImage instance has no attribute '_PhotoImage__photo'" in <bound method PhotoImage.__del__ of <PIL.ImageTk.PhotoImage instance at 0x05CC63C8>> ignored Traceback (most recent call last): File "C:\Python25\lib\lib-tk\Tkinter.py", line 1403, in __call__ return self.func(*args) File "main.py", line 19, in imgaffiche can.create_image(0,0, anchor = NW, image=photo) File "C:\Python25\lib\lib-tk\Tkinter.py", line 2154, in create_image return self._create('image', args, kw) File "C:\Python25\lib\lib-tk\Tkinter.py", line 2145, in _create *(args + self._options(cnf, kw)))) TypeError: __str__ returned non-string (type file)
Pour recentrer le soucis, je veux redimensionner une image (avant de tripatouiller mon code, elle s'affichait bien).
En relisant la doc de PhotoImage, j'ai vu la fonction zoom(x,y) mais je ne vois pas à quoi correspondent les x et y. Est ce que ce sont les nouvelles tailles en pixels? Ou le nombre de pixel en plus que l'on voudrait? Ou encore le pourcentage? J'ai essayé avec les dimensions de mon canevas, mais ça n'a rien changé.
tu pourrai montrer ton code car l'erreur dit que qu'une variable n'est pas en string ???!!!
Donc ça pourrai nous aider à comprendre ton erreur.
![]()
je me suis inspiré de ton code pour mettre une image et j'ai exactement la même chose en python3, tout en faisant les modification nécéssaire
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 class logo: img = open("logo.ico") photo = PhotoImage(img) canvas = Canvas(fenetre, width = 40, height = 40, bg='lightblue') canvas.create_image(0,0, anchor = NW, image=photo) canvas.pack()
Bonjour,
Ça manque de code...
Si c'est pour redimensionner une image en fonction de ton Canvas, tu peux t'inspirer de ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 #!/usr/bin/python # -*- coding: utf-8 -*- from Tkinter import * from PIL import Image, ImageTk class TestResize: def __init__(self): self.root=Tk() self.image = Image.open("test.jpg") self.x, self.y = self.image.size self.can=Canvas(self.root,bg='white') self.can.bind("<Configure>",self.resize) self.can.pack(expand=Y,fill=BOTH) def resize(self,event): self.img=self.image.resize((event.width,event.height)) self.mon_image = ImageTk.PhotoImage(self.img) self.can.create_image(0, 0, image=self.mon_image, anchor=NW) app=TestResize() app.root.mainloop()
malheureusement pour moi je ne peux pas car PIL n'est pas adapté pour python 3.0. Également j'ai toujours la même erreur même en faisant les modifications nécessaire.![]()
Vérifie tes imports, et si nécessaire relis ceci : Comment importer des modules/fonctions/fichiers ?
=> Donne la même erreur que toi
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 from PIL import Image, ImageTk import Tkinter as Tk img = Image.open('image.jpg') root = Tk.Tk() photo = Tk.PhotoImage(img) can = Tk.Canvas(root, bg='white') can.pack(expand=Tk.Y, fill=Tk.BOTH) can.create_image(0, 0, image=photo, anchor=Tk.NW)
=> Fonctionne sans problème
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 from PIL import Image, ImageTk import Tkinter as Tk img = Image.open('image.jpg') root = Tk.Tk() photo = ImageTk.PhotoImage(img) can = Tk.Canvas(root, bg='white') can.pack(expand=Tk.Y, fill=Tk.BOTH) can.create_image(0, 0, image=photo, anchor=Tk.NW)
Partager