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!
Version imprimable
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
Vérifie que tu n'as pas redéfini la variable Image
non, j'ai ça:
Mais je ne touche pas au nom des modulesCode:
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:
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:
1
2 photo = ImageTk.PhotoImage(img)
:D
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...
c'est quoi ta version de python?
2.5 que j'utilise sur PythonWin
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.
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:ccool:
J'ai trouvé mais je reste une quiche!(l'honneur est sauf! :D)
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:
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.
:ccool:
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:
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:
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. :roll:
Vérifie tes imports, et si nécessaire relis ceci : Comment importer des modules/fonctions/fichiers ?
=> Donne la même erreur que toiCode:
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èmeCode:
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)