IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Tkinter Python Discussion :

(une autre) Balle qui rebondit - récursivité


Sujet :

Tkinter Python

  1. #1
    Membre régulier Avatar de RowanMayfair
    Femme Profil pro
    Développeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 47
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Points : 89
    Points
    89
    Par défaut (une autre) Balle qui rebondit - récursivité
    Bonjour (ou re...),

    Je découvre donc la fonction sympa .after

    Mais ça fait 3 heures que je tente de comprendre où est mon erreur dans ce tout petit script :

    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
    def move() :
        "déplacement de la balle"
        global x1,y1,dx,dy,flag
        x1,y1 = x1 + dx,y1 + dy
        if 125 <= x1 <= 220 and 0 <= y1 <= 95 :
            dx,dy = 5,5
        if 95 <= x1 <= 220 and 95 <= y1 <= 220 :
            dx, dy = -5,5
        if 0 <= x1 <= 95 and 125 <= y1 <= 220 :
            dx,dy = -5,-5
        if 0 <= x1 <= 125 and 0 <= y1 <= 125 :
            dx,dy = 5,-5
        can1.coords(oval1,x1,y1,x1+30,y1+30)
        if flag > 0 :
            fen1.after(50,move)
    
    def stop_it():
        global flag
        flag = 0
    
    def start_it() :
        global flag
        if flag == 0 :
            flag = 1
            move()
    
    x1,y1 = 125,0
    dx,dy = 5,5
    flag = 0
    
    fen1 = Tk()
    fen1.title("Exercice d'animation avec tkinter")
    
    can1 = Canvas(fen1,bg='dark grey',height=250,width=250)
    can1.pack(side=LEFT,padx=5,pady=5)
    oval1 = can1.create_oval(x1,y1,x1+30,y1+30,width=2,fill='pink')
    Button(fen1,text='Quitter',width=8,command=fen1.quit).pack(side=BOTTOM)
    Button(fen1,text='Démarrer',width=8,command=start_it).pack()
    Button(fen1,text='Arrêter',width=8,command=stop_it).pack()
    
    fen1.mainloop()
    
    fen1.destroy()
    J'ai mis des "print" partout, il semble que ce soit entre la fin de la boucle et....elle ne repart pas, puisque mon y1 continue de descendre en-dessous de 0.
    Il est pourtant clairement borné non ?

    Peut-être que des yeux neufs verront...ce que je ne suis pas capable de voir.

    D'avance merci

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par RowanMayfair Voir le message
    Peut-être que des yeux neufs verront...ce que je ne suis pas capable de voir.
    Faites un print(x1, y1, dx, dy) et regardez ce qu'il se passe.

    note: écrire proprement des if ... elif... else... est quelque chose qu'on doit avoir appris avant de se lancer dans tkinter.

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

  3. #3
    Membre régulier Avatar de RowanMayfair
    Femme Profil pro
    Développeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 47
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Points : 89
    Points
    89
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,



    Faites un print(x1, y1, dx, dy) et regardez ce qu'il se passe.

    note: écrire proprement des if ... elif... else... est quelque chose qu'on doit avoir appris avant de se lancer dans tkinter.

    - W
    J'ai vu ce qu'il se passait. Je n'ai pas oublié ce conseil d'afficher ce que fait le programme quand on peut (j'applique les conseils qu'on me donne...du moins j'essaie) Mais je comprends pas pourquoi.

    Et je ne sais toujours pas ce qui cloche avec mes if Je viens de relire le cours concerné, il est succint.....et ne m'éclaire pas.

    Donc si personne ne me le dit, je ne le saurai pas, et continuerai de faire cette erreur.

    M'embarquer seule dans cet apprentissage, alors que je n'ai absolument aucune notion de programmation au départ, et personne dans mon entourage pour m'aider, était peut-être trop ambitieux. Je ne sais pas.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par RowanMayfair Voir le message
    J'ai vu ce qu'il se passait. Je n'ai pas oublié ce conseil d'afficher ce que fait le programme quand on peut (j'applique les conseils qu'on me donne...du moins j'essaie) Mais je comprends pas pourquoi.
    Si vous avez vu ce qu'il se passait, vous pourriez commencer décrire ce qui ne va pas dans la suite des x1, y1, dx, dy affichés et arriver à vous dire "tiens lorsque les valeurs de x1, y1 sont ... dx dy devraient être....".
    Tant que vous n'avez pas sorti çà, vous ne pourrez pas relire votre code "intelligemment" pour arriver à comprendre le problème.


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

  5. #5
    Membre régulier Avatar de RowanMayfair
    Femme Profil pro
    Développeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 47
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Points : 89
    Points
    89
    Par défaut
    la dernière ligne de ma boucle continue...avec dx =5 et dy = -5, donc y1 diminue en-dessous de 0 alors qu'il ne devrait pas, sans que je comprenne pourquoi.

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par RowanMayfair Voir le message
    la dernière ligne de ma boucle continue...avec dx =5 et dy = -5, donc y1 diminue en-dessous de 0 alors qu'il ne devrait pas, sans que je comprenne pourquoi.
    Ben vous relisez votre code...
    Dans la suite de tests:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        if 125 <= x1 <= 220 and 0 <= y1 <= 95 :
            dx,dy = 5,5
        if 95 <= x1 <= 220 and 95 <= y1 <= 220 :
            dx, dy = -5,5
        if 0 <= x1 <= 95 and 125 <= y1 <= 220 :
            dx,dy = -5,-5
        if 0 <= x1 <= 125 and 0 <= y1 <= 125 :
            dx,dy = 5,-5
    qu'est ce qui est supposé modifier dx, dy lorsque y1 < 0?

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

  7. #7
    Membre régulier Avatar de RowanMayfair
    Femme Profil pro
    Développeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 47
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Points : 89
    Points
    89
    Par défaut
    mais rien, puisque y ne devrait pas être inférieur à 0.

    Quand y atteint 0, avec after ça devrait boucler, et repartir sur le 1er if, non ?


    Quoiqu'il en soit, mes if servent à ça, à ce que x ou y restent entre 0 et 220.

  8. #8
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Salut.

    Citation Envoyé par RowanMayfair Voir le message
    Quoiqu'il en soit, mes if servent à ça, à ce que x ou y restent entre 0 et 220.
    Déjà, pourquoi que des if ? La logique voudrait que ce soit if ... elif ... elif
    Que se passe t-il si x1 = 125 et y1 = 95 ? Déjà, c'est un problème, puisqu'on entre dans 2 conditions.

    De toute façon, pour ma part je ne comprends rien à la logique de tes conditions, alors qu'en fait tout ce qu'il y a à faire, c'est de regarder si la position suivante du x est toujours supérieure à 0 et x2 toujours inférieure à 250, et si non, inverserser le dx, même chose pour le y et y2.
    Et surtout ajouter les dx et dy au x et y après avoir testé ces conditions.
    Le temps ronge l'amour comme l'acide.

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par RowanMayfair Voir le message
    mais rien, puisque y ne devrait pas être inférieur à 0.

    Quand y atteint 0, avec after ça devrait boucler, et repartir sur le 1er if, non ?
    C'est ce que j'appelle une hypothèse (que vous faites sur ce que le code devrait faire).
    Dans les instructions qui se déroulent lorsque le premier "if" est vrai, ajoutez y:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if 125 <= x1 <= 220 and 0 <= y1 <= 95 :
            dx,dy = 5,5
            if y1 == 0:
               print ('****')
    pour vérifier que çà passe bien par là (votre hypothèse).
    Et regardez la sortie du print((x1, y1, dx, dy) suivant.

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

  10. #10
    Membre régulier Avatar de RowanMayfair
    Femme Profil pro
    Développeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 47
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Points : 89
    Points
    89
    Par défaut
    c'est pas grave.
    Je vais tenter un autre support pour apprendre, peut-être ça marchera mieux

    merci

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par RowanMayfair Voir le message
    c'est pas grave.
    Je vais tenter un autre support pour apprendre, peut-être ça marchera mieux
    C'est pas un problème de "support" mais de logique.
    La logique avec laquelle vous relisez votre code pour comprendre ce qui ne se passe pas comme attendu.
    Ce sont vos méninges qui produisent ce cheminement, donc il faut muscler votre cerveau.
    Alors vous pouvez mettre ce soucis de côté pour continuer d'autres exercices et revenir à celui ci un peu plus tard: votre cerveau aura progressé, vous regarderez la chose depuis un autre angle,... mais changer de support de cours ne vous servira à rien.

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

  12. #12
    Membre expérimenté

    Homme Profil pro
    linux, pascal, HTML
    Inscrit en
    Mars 2002
    Messages
    649
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : linux, pascal, HTML
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2002
    Messages : 649
    Points : 1 493
    Points
    1 493
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,

    C'est pas un problème de "support" mais de logique.
    La logique avec laquelle vous relisez votre code pour comprendre ce qui ne se passe pas comme attendu.
    Ce sont vos méninges qui produisent ce cheminement, donc il faut muscler votre cerveau.
    Alors vous pouvez mettre ce soucis de côté pour continuer d'autres exercices et revenir à celui ci un peu plus tard: votre cerveau aura progressé, vous regarderez la chose depuis un autre angle,... mais changer de support de cours ne vous servira à rien.

    - W
    Entièrement d'accord !
    D'abord, je vois qu'on incrémente x1 et y1 avant même de vérifier si on a les bons dx et dy
    Ensuite les deux axes sont indépendant et donc on peut traiter séparément les x et les y
    Lorqu'on atteint une borne x ou y le dx ou dy correspondants change de signe car on repart dans l'autre sens et donc dx=-dx ou dy =-dy
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        if x1>220 or x1<0 :
            dx=-dx
        if y1>220 or y1<0 :
            dy=-dy
    Ensuite en ajoute les incréments à x1 et y1, on affiche et cela roule.
    Si cela ne va toujours pas je peux ajouter le code complet qui fonctionne chez moi.

  13. #13
    Membre régulier Avatar de RowanMayfair
    Femme Profil pro
    Développeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 47
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Points : 89
    Points
    89
    Par défaut
    Merci

    Mais la réalité, c'est que la représentation graphique, c'est pas mon fort.
    Donc le chapitre sur Turtle était un cauchemar, et le canevas de tkinter n'est guère plus facile.

    tout ça pour dire que j'ai besoin d'une pause dans le canevas. Et pendant ce temps là sur l'autre support, pas un X,Y en vue pour l'instant je revis

    Je reprendrai certainement cet exercice dans quelques jours

  14. #14
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par Michel Voir le message
    Ensuite en ajoute les incréments à x1 et y1, on affiche et cela roule.
    Si cela ne va toujours pas je peux ajouter le code complet qui fonctionne chez moi.
    L'auteur du post a juste modifié l'exemple donné dans le Swinnen (qui fonctionne).

    Après soit on essaie de comprendre pourquoi çà ne marche pas, soit on jette tout et on part sur une autre approche...
    Ceci dit, "comprendre pourquoi çà ne marche pas" i.e. apprendre à relire son code et beaucoup plus formateur...

    Surtout lorsque le soucis est de ne pas comprendre pourquoi c ne sera pas -10 lorsqu'on écrit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    a = 0
    if a <= 0:
         c = -10
    if a >= 0:
         c = 10
    print(c)
    et le vrai boulot lorsqu'on débute, c'est pas tellement de faire bouger des balles mais arriver à retrouver ces constructions simples dans le code qu'on relit... comme on essaie de retrouver sujet-verbe-complément dans une phrase pour en saisir le sens.

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

  15. #15
    Membre expérimenté

    Homme Profil pro
    linux, pascal, HTML
    Inscrit en
    Mars 2002
    Messages
    649
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : linux, pascal, HTML
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2002
    Messages : 649
    Points : 1 493
    Points
    1 493
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    c'est effectivement plus les graphiques en math que canvas qui pose problème et donc une petite révision serait bien utile.
    A toute fin utile, voilà un code qui fonctionne (normalement )
    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
     
    from tkinter import * 
     
    def move() :
        "déplacement de la balle"
        global x1,y1,dx,dy,flag
     
        if x1>220 or x1<0 :
            dx=-dx
        if y1>220 or y1<0 :
            dy=-dy
        x1,y1 = x1 + dx,y1 + dy
        can1.coords(oval1,x1,y1,x1+30,y1+30)
        if flag==1 :
            fen1.after(50,move)
     
    def stop_it():
        global flag
        flag = 0
     
    def start_it() :
        global flag
        if flag == 0 :
            flag = 1
            move()
     
    x1,y1 = 125,0
    dx,dy = 5,5
    flag = 0
     
    fen1 = Tk()
    fen1.title("Exercice d'animation avec tkinter")
     
    can1 = Canvas(fen1,bg='dark grey',height=250,width=250)
    can1.pack(side=LEFT,padx=5,pady=5)
    oval1 = can1.create_oval(x1,y1,x1+30,y1+30,width=2,fill='pink')
    Button(fen1,text='Quitter',width=8,command=fen1.quit).pack(side=BOTTOM)
    Button(fen1,text='Démarrer',width=8,command=start_it).pack()
    Button(fen1,text='Arrêter',width=8,command=stop_it).pack()
     
    fen1.mainloop()
     
    fen1.destroy()

Discussions similaires

  1. [CS3] une balle qui rebondit de tout les cotés du document
    Par carasmel dans le forum ActionScript 1 & ActionScript 2
    Réponses: 2
    Dernier message: 08/07/2011, 13h00
  2. Réponses: 0
    Dernier message: 04/03/2011, 12h16
  3. Réponses: 3
    Dernier message: 28/11/2008, 08h21
  4. Imprimer une autre page qui est en PHP
    Par FrankOVD dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 08/08/2005, 19h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo