Problème sur liste

Fermé
KRO - Modifié le 6 mai 2018 à 21:36
 KRO - 8 mai 2018 à 12:56
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 23342 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 novembre 2024 Ambassadeur 1 550
6 mai 2018 à 22:53
bonsoir, sur quelle ligne as-tu le message d'erreur?
0
Bonsoir, le problème s’affiche sur la ligne 29.
0
critou > KRO
7 mai 2018 à 10:29
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
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 23342 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 novembre 2024 1 550 > KRO
7 mai 2018 à 19:49
moi j'aurais supprimé la ligne 19,
liste_images =...
0
et plutôt garder "for nom in...." ?
0