Tkinter : créer une liste

KRO -  
 KRO -
Bonjour,

je suis débutante et je me lance dans la programmation d'un jeu. Plusieurs images y sont en mouvement, seulement voilà ce que donne le programme :
 from tkinter import*
import os
from PIL import Image, ImageTk
 
def deplacement():
    global dx, dy
    if canvas.coords(W_image)[1]>400:
       canvas.coords(W_image,180,0)
    if canvas.coords(W_image1)[1]>400:
       canvas.coords(W_image1,180,0)
    if canvas.coords(W_image2)[1]>400:
       canvas.coords(W_image2,180,0)  
    if canvas.coords(W_image3)[1]>400:
       canvas.coords(W_image3,180,0)
    if canvas.coords(W_image4)[1]>400:
       canvas.coords(W_image4,180,0)
    if canvas.coords(W_image5)[1]>400:
       canvas.coords(W_image5,180,0)
    if canvas.coords(W_image6)[1]>400:
       canvas.coords(W_image6,300,0)
    if canvas.coords(W_image7)[1]>400:
       canvas.coords(W_image7,300,0)
    if canvas.coords(W_image8)[1]>400:
       canvas.coords(W_image8,300,0)
    if canvas.coords(W_image9)[1]>400:
       canvas.coords(W_image9,300,0)
    if canvas.coords(W_image10)[1]>400:
       canvas.coords(W_image10,300,0)
    if canvas.coords(W_image11)[1]>400:
       canvas.coords(W_image11,300,0)
    canvas.move(W_image,dx,dy)
    canvas.move(W_image1,dx,dy)
    canvas.move(W_image2,dx,dy)
    canvas.move(W_image3,dx,dy)
    canvas.move(W_image4,dx,dy)
    canvas.move(W_image5,dx,dy)
    canvas.move(W_image6,dx,dy)
    canvas.move(W_image7,dx,dy)
    canvas.move(W_image8,dx,dy) 
    canvas.move(W_image9,dx,dy)
    canvas.move(W_image10,dx,dy)
    canvas.move(W_image11,dx,dy)
    root.after(60,deplacement)

 
dx=0
dy=5

root = Tk() 

#Chemin pour les images
script_dir = os.path.dirname(__file__)
rel_path = "/images/"
abs_file_path = script_dir + rel_path

image = Image.open(abs_file_path+"baptiste.png")
photobaptiste = ImageTk.PhotoImage(image)

image = Image.open(abs_file_path+"clarys.png")
photoclarys = ImageTk.PhotoImage(image)

image = Image.open(abs_file_path+"anais.png")
photoanais = ImageTk.PhotoImage(image)

image = Image.open(abs_file_path+"allan.png")
photoallan = ImageTk.PhotoImage(image)

image = Image.open(abs_file_path+"arnold.png")
photoarnold = ImageTk.PhotoImage(image)

image = Image.open(abs_file_path+"thomas.png")
photothomas = ImageTk.PhotoImage(image)

image = Image.open(abs_file_path+"ayoub.png")
photoayoub = ImageTk.PhotoImage(image)

image = Image.open(abs_file_path+"caroline.png")
photocaroline = ImageTk.PhotoImage(image)

image = Image.open(abs_file_path+"deborah.png")
photodeborah = ImageTk.PhotoImage(image)

image = Image.open(abs_file_path+"louis.png")
photolouis = ImageTk.PhotoImage(image)

image = Image.open(abs_file_path+"paul.png")
photopaul = ImageTk.PhotoImage(image)

image = Image.open(abs_file_path+"nono.png")
photonono = ImageTk.PhotoImage(image)

canvas=Canvas(root, width=500, height=400, bg='white')
canvas.pack(padx=10,pady=10)

#On cree le Widget image dans le canvas:
#NW=Nord West, le coin haut guche de l'image sera positionne a (10,10):
W_image=canvas.create_image(180,0,anchor=NW,image=photoclarys)
W_image1=canvas.create_image(180,50,anchor=NW,image=photobaptiste)
W_image2=canvas.create_image(180,120,anchor=NW,image=photoanais)
W_image3=canvas.create_image(180,190,anchor=NW,image=photoallan)
W_image4=canvas.create_image(180,250,anchor=NW,image=photoarnold)
W_image5=canvas.create_image(180,330,anchor=NW,image=photothomas)
W_image6=canvas.create_image(300,0,anchor=NW,image=photoayoub)
W_image7=canvas.create_image(300,50,anchor=NW,image=photocaroline)
W_image8=canvas.create_image(300,120,anchor=NW,image=photodeborah)
W_image9=canvas.create_image(300,190,anchor=NW,image=photolouis)
W_image10=canvas.create_image(300,250,anchor=NW,image=photopaul)
W_image11=canvas.create_image(300,330,anchor=NW,image=photonono)

deplacement()
 
root.mainloop() 
Je suis bien consciente que ce n'est ni facile à lire ni esthétique avec autant de lignes, c'est pour cela que j'aimerai tout regrouper grâce à une liste, mais je ne comprend pas trop comment faire. Si quelqu'un veut bien m'aider, merci d'avance.



1 réponse

yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
bonjour, probablement quelque chose du genre:
for uneimage in liste_images : 
    if canvas.coords(uneimage)[1]>400 :
       canvas.coords(uneimage,300,0)
    canvas.move(uneimage,dx,dy)

ainsi que:
for nom in ["baptiste", "clarys", ... , "nono"] : 
    image = Image.open(abs_file_path + nom + ".png")
    photo = ImageTk.PhotoImage(image)
    liste_images.append(canvas.create_image(180,0,anchor=NW,image=photo))
0
KRO
 
Merci beaucoup de ton aide !!
0
KRO
 
liste_images n'est pas défini ici ?
0
KRO
 
from tkinter import*
import os
from PIL import Image, ImageTk

#Chemin pour les images
script_dir = os.path.dirname(__file__)
rel_path = "/images/"
abs_file_path = script_dir + rel_path
    
for nom in ["baptiste", "clarys", "anais", "allan", "arnold", "thomas", "ayoub", "caroline", "deborah", "louis", "paul", "nono"] :
    image = Image.open(abs_file_path + nom + ".png")
    liste_images = ImageTk.PhotoImage(image)
    liste_images.append(canvas.create_image(180,0,anchor=NW,image=liste_images))
    
for uneimage in liste_images : 
    if canvas.coords(uneimage)[1]>400 :
       canvas.coords(uneimage,300,0)
    canvas.move(uneimage,dx,dy) 
 
def deplacement():
    global dx, dy
    if canvas.coords(W_image)[1]>400:
       canvas.coords(W_image,180,0)
    if canvas.coords(W_image1)[1]>400:
       canvas.coords(W_image1,180,0)
    if canvas.coords(W_image2)[1]>400:
       canvas.coords(W_image2,180,0)  
    if canvas.coords(W_image3)[1]>400:
       canvas.coords(W_image3,180,0)
    if canvas.coords(W_image4)[1]>400:
       canvas.coords(W_image4,180,0)
    if canvas.coords(W_image5)[1]>400:
       canvas.coords(W_image5,180,0)
    if canvas.coords(W_image6)[1]>400:
       canvas.coords(W_image6,300,0)
    if canvas.coords(W_image7)[1]>400:
       canvas.coords(W_image7,300,0)
    if canvas.coords(W_image8)[1]>400:
       canvas.coords(W_image8,300,0)
    if canvas.coords(W_image9)[1]>400:
       canvas.coords(W_image9,300,0)
    if canvas.coords(W_image10)[1]>400:
       canvas.coords(W_image10,300,0)
    if canvas.coords(W_image11)[1]>400:
       canvas.coords(W_image11,300,0)
    canvas.move(W_image,dx,dy)
    canvas.move(W_image1,dx,dy)
    canvas.move(W_image2,dx,dy)
    canvas.move(W_image3,dx,dy)
    canvas.move(W_image4,dx,dy)
    canvas.move(W_image5,dx,dy)
    canvas.move(W_image6,dx,dy)
    canvas.move(W_image7,dx,dy)
    canvas.move(W_image8,dx,dy) 
    canvas.move(W_image9,dx,dy)
    canvas.move(W_image10,dx,dy)
    canvas.move(W_image11,dx,dy)
    root.after(60,deplacement)

 
dx=0
dy=5

root = Tk() 

canvas=Canvas(root, width=500, height=400, bg='white')
canvas.pack(padx=10,pady=10)

deplacement()
 
root.mainloop() 
Voici mon code modifié et mon message d'erreur : RuntimeError: Too early to create image ; je ne comprend pas d'où vient le problème... merci de ton aide.
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > KRO
 
je ne faisais que te donne un exemple de logique, tu dois l'adapter pour tenir compte du fait que les coordonnées ne sont pas les mêmes pour toute les images.
tu dois aussi réfléchir où placer le code suggéré, quel code cela remplace.
je me demande si tu ne devrais pas commencer par utiliser des boucles et des listes avec des exercices plus simples.
0
KRO
 
Merci, je vais travailler la dessus.
0