Problème sur liste

KRO -  
 KRO -
Bonjour, je cherche à créer une liste pour raccourcir et clarifier un peu mon programme mais cela ne fonctionne pas et je ne vois pas d'où provient l'erreur si quelqu'un sait me répondre... merci beaucoup
 
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

liste_images = ["clarys.png", "baptiste.png", "anais.png", "allan.png", "arnold.png", "thomas.png", "ayoub.png", "caroline.png", "deborah.png", "louis.png", "paul.png", "nono.png"]

for nom in ["clarys", "baptiste", "anais", "allan", "arnold", "thomas", "ayoub", "caroline", "deborah", "louis", "paul", "nono"] :
    images = Image.open(abs_file_path + nom + ".png")
    photo = ImageTk.PhotoImage(images)
    liste_images.append(canvas.create_image(180,0,image=photo))
    
for uneimage in liste_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 : IndexError: list index out of range



1 réponse

yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
bonsoir, sur quelle ligne as-tu le message d'erreur?
0
KRO
 
Bonsoir, le problème s’affiche sur la ligne 29.
0
critou > KRO
 
Bonjour.

Cela est tout de même flagrant.
Tu définis dans liste_images des noms d'images avec leur extension, puis ensuite tu y ajoutes les identifiants des images sur le canvas, déjà là, 1ère erreur car tu mélanges torchons et serviettes.

Et forcément, lorsque tu fais
if canvas.coords(uneimage)[1]>400
, uneimage (qui contient donc tes xxx.png), tkinter ne les trouve pas sur ton canvas et il retourne une liste (ou tuple je sais plus) vide, et donc l'index 1 n'existe pas dans cette liste, d'où l'erreur.

Autre chose, pourquoi donc faire
for nom in ["clarys", ... "nono"] :
alors que tes noms d'images sont déjà enregistrées dans ta liste ?

Et je pense que tkinter va seulement afficher ta dernière image, puisque dans ta boucle tu écrases chaque fois la référence à l'image
photo = ImageTk.PhotoImage(images)
0
KRO
 
Voici mon programme corrigé je ne comprend pas vraiment comment arranger cela... je suis débutante

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

liste_images = ["clarys.png", "baptiste.png", "anais.png", "allan.png", "arnold.png", "thomas.png", "ayoub.png", "caroline.png", "deborah.png", "louis.png", "paul.png", "nono.png"]

images = Image.open(liste_images)
photo = ImageTk.PhotoImage(images)
liste_images.append(canvas.create_image(180,0,image=photo))
    
for uneimage in liste_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()
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > KRO
 
moi j'aurais supprimé la ligne 19,
liste_images =...
0
KRO
 
et plutôt garder "for nom in...." ?
0