Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Programmation multimédia/Jeux Python Discussion :

Animation de gauche à droite et de droite à gauche d'une image


Sujet :

Programmation multimédia/Jeux Python

  1. #1
    Nouveau membre du Club
    Animation de gauche à droite et de droite à gauche d'une image
    Bonjour à tous,

    J'ai une image .gif que je souhaite déplacer de gauche à droite dans une fenêtre tkinter, puis arrivée en bout de fenêtre je voudrai que l'image rebrousse chemin, donc que l'image fasse un aller-retour tout en restant sur la même ligne.

    J'ai réussi à réaliser la fonction déplacement (déplacement1) pour l'aller de gauche à droite de l'image, mais quand j'insère dans le script une deuxième fonction déplacement (déplacement2) pour simuler le retour de l'image, ça plante ! Il n'y a même plus d'aller....
    Voici ci-dessous mon script. Pouvez-vous m'aider à résoudre mon problème ? Que dois-je modifier dans mon programme pour observer l'aller ET le retour de mon image dans la fenêtre tkinter ? Merci.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    from tkinter import *
     
     
    tk = Tk()
     
    Height=500
    Width=800
     
    def deplacement1():
        img_coords = canvas.coords(image)
        img_width = img_2.width()
        img_height = img_2.height()
     
        if img_coords[0] + img_width <= 800:
              canvas.move(image, 5, 0)
              tk.after(40, deplacement1)
     
    def deplacement2():
     
        img_coords = canvas.coords(image)
        img_width = img_2.width()
        img_height = img_2.height()
     
        if img_coords[0] + img_width !=0:
     
            canvas.move(image, -5, 0)
            tk.after(40, deplacement2)
     
     
    canvas= Canvas(tk, width = Width, height = Height)
    canvas.pack()
     
    imgfile = "/Users/OLIVIER/Desktop/serpent2.png"
     
    img= PhotoImage(file=imgfile)
     
    img_2 = img.subsample(2,2)
    image = canvas.create_image(50,200, image=img_2)
     
     
    deplacement1()
    deplacement2()
     
    tk.mainloop()

  2. #2
    Membre expérimenté
    Pas le temps d'approfondir mais tu as vu que dans un cas, tu as <= et l'autre !=0 ?
    Parce que dans le deuxième cas, si cela ne tombe pas juste...
    Pas d'aide par mp.

  3. #3
    Nouveau membre du Club
    Oui j ai bien vu.
    Je pensais que cela etait correct:
    Si la somme des coordonnees sur l axe des "x" est differente de zero, faire decroitre l abscisse de 5 pixels

  4. #4
    Expert éminent sénior
    Salut,

    Si toutes les 40 Ms, vous exécutez animation1 et animation2,
    • à t0 + 40 Ms, vous allez déplacer l'image à droite de 5 puis à gauche de 5,
    • à t0 + 80 Ms, vous allez déplacer l'image à droite de 5 puis à gauche de 5,
    • ...

    et donc çà fera du surplace...

    Si vous voulez garder cette structure, il faut déclencher animation2 lorsque animation1 touche le bord et réciproquement (ou avoir une seule fonction qui ajoute un déplacement qui change de signe).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Nouveau membre du Club
    Merci pour cette remarque.
    Je vais tenter de trouver une solution

  6. #6
    Futur Membre du Club
    Bonjour,

    Une manière de le faire pourrait être de rajouter un "else" dans chaque fonction et d'appeler les fonctions l'une dans l'autre.
    Pour illustrer mon propos :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    def deplacement1():
        img_coords = canvas.coords(image)
        img_width = img_2.width()
        img_height = img_2.height()
     
        if img_coords[0] + img_width <= 800:
              canvas.move(image, 5, 0)
              tk.after(40, deplacement1)
        else:
            canvas.move(image, -5, 0)
            tk.after(40, deplacement2)
     
    def deplacement2():
     
        img_coords = canvas.coords(image)
        img_width = img_2.width()
        img_height = img_2.height()
     
        if img_coords[0] + img_width >= 0:
            canvas.move(image, -5, 0)
            tk.after(40, deplacement2)
        else:
            canvas.move(image, 5, 0)
            tk.after(40, deplacement1)


    De cette manière, tu peux faire des allers-retours permanent ou un simple aller-retour en supprimant le "else" de la fonction "deplacement2"

  7. #7
    Nouveau membre du Club
    Merci !
    Bonjour,

    Merci pour cette proposition. Je vais tester.
    Bonne journée !

###raw>template_hook.ano_emploi###