Problème liste s'il vous plaît !!

- - Dernière réponse :  KRO - 9 mai 2018 à 20:37
Bonjour, j'ai un problème depuis plusieurs jours impossible de trouver une solution.... Je parcours les tutos, les forums mais rien n'y fait...

import tkinter as tk
import os
from PIL import Image, ImageTk
 
root = tk.Tk()
 
dx = tk.IntVar()
dy = tk.IntVar()
 
canvas=tk.Canvas(root, width=500, height=400, bg='white')
canvas.pack(padx=10,pady=10)
 
#Chemin pour les images
script_dir = os.path.dirname(__file__)
rel_path = "/images/"
abs_file_path = script_dir + rel_path
 
images = [0]*12
noms = ["clarys", "baptiste", "anais", "allan", "arnold", "thomas", "ayoub", "caroline", "deborah", "louis", "paul", "nono"]
 
for i in range(12):
    images[i] = Image.open(abs_file_path + noms[i] + ".png")
    photo = ImageTk.PhotoImage(images)
    canvas.create_image(180,0,image=photo)
     
for uneimage in images:
    dx.set(0)
    dy.set(5)
    if canvas.coords(uneimage)[1]>400 :
       canvas.coords(uneimage,180,0)
    canvas.move(uneimage,dx.get(),dy.get())
  
root.mainloop()


Voici mon message d'erreur :

File "/Users/FamilleDude/anaconda3/lib/python3.6/site-packages/PIL/ImageMode.py", line 55, in getmode
return _modes[mode]
TypeError: unhashable type: 'list'

Je suis complètement perdue si quelqu'un sait m'aider ça serait géniale !!
Afficher la suite 

Votre réponse

1 réponse

Messages postés
70
Date d'inscription
mercredi 1 novembre 2000
Dernière intervention
1 juin 2018
0
Merci
Bonsoir,

alors oui tkinter ne gère pas le format 'png' et on est donc obligé d'utiliser la bibliothèque PIL pour le rendre compatible.
La procédure consiste à fournir un fichier png à la méthode ImageTk.PhotoImage() , or ici vous fournissez la variables 'images' qui n'est pas un fichier image mais une liste.
Ensuite vous créez des objets image dont vous ne conservez pas l'id, or vous en aurez besoin rien que pour leur déplacement prévu dans la partie 2 de votre code.

Je vous conseille donc d'écrire:
    image = Image.open(abs_file_path + noms[i] + ".png")
    photo = ImageTk.PhotoImage(image)
    images[i] = canvas.create_image(180,0,image=photo)



--
Bonsoir, merci de ta réponse, j'ai enfait trouvé une solution au problème sur la première partie du code, avant que tu ne me répondes :
import tkinter as tk
import os
from PIL import Image, ImageTk
 
root = tk.Tk()
 
dx = tk.IntVar()
dy = tk.IntVar()
 
canvas=tk.Canvas(root, width=500, height=400, bg='white')
canvas.pack(padx=10,pady=10)
 
#Chemin pour les images
script_dir = os.path.dirname(__file__)
rel_path = "/images/"
abs_file_path = script_dir + rel_path
 
images = []
noms = ["clarys", "baptiste", "anais", "allan", "arnold", "thomas", "ayoub", "caroline", "deborah", "louis", "paul", "nono"]
 
for i in range(12):
    images.append(Image.open(abs_file_path + noms[i] + ".png"))
    images[i] = ImageTk.PhotoImage(images[i])
    canvas.create_image(180,0,image=images[i])

for uneimage in images:
    dx.set(0)
    dy.set(5)
    if canvas.coords(uneimage)[1]>400 :
       canvas.coords(uneimage,180,0)
    canvas.move(uneimage,dx.get(),dy.get())
  
root.mainloop()


Cependant, comment dois-je m'y prendre pour la deuxième partie du programme ? Merci de votre aide.
Commenter la réponse de Mints

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.