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

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Demandeur d'emploi
    Inscrit en
    mars 2019
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Demandeur d'emploi

    Informations forums :
    Inscription : mars 2019
    Messages : 83
    Points : 34
    Points
    34

    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
    Modérateur

    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    13 557
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 13 557
    Points : 22 767
    Points
    22 767

    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
    Nouveau membre du Club
    Femme Profil pro
    Demandeur d'emploi
    Inscrit en
    mars 2019
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Demandeur d'emploi

    Informations forums :
    Inscription : mars 2019
    Messages : 83
    Points : 34
    Points
    34

    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
    Modérateur

    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    13 557
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 13 557
    Points : 22 767
    Points
    22 767

    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
    Nouveau membre du Club
    Femme Profil pro
    Demandeur d'emploi
    Inscrit en
    mars 2019
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Demandeur d'emploi

    Informations forums :
    Inscription : mars 2019
    Messages : 83
    Points : 34
    Points
    34

    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
    Modérateur

    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    13 557
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 13 557
    Points : 22 767
    Points
    22 767

    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
    Nouveau membre du Club
    Femme Profil pro
    Demandeur d'emploi
    Inscrit en
    mars 2019
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Demandeur d'emploi

    Informations forums :
    Inscription : mars 2019
    Messages : 83
    Points : 34
    Points
    34

    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 éprouvé

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

    Informations professionnelles :
    Activité : ValueError

    Informations forums :
    Inscription : avril 2016
    Messages : 691
    Points : 1 020
    Points
    1 020
    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
    Modérateur

    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    13 557
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 13 557
    Points : 22 767
    Points
    22 767

    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
    Nouveau membre du Club
    Femme Profil pro
    Demandeur d'emploi
    Inscrit en
    mars 2019
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Demandeur d'emploi

    Informations forums :
    Inscription : mars 2019
    Messages : 83
    Points : 34
    Points
    34

    Par défaut

    c'est pas grave.
    Je vais tenter un autre support pour apprendre, peut-être ça marchera mieux

    merci

  11. #11
    Modérateur

    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    13 557
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 13 557
    Points : 22 767
    Points
    22 767

    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
    614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : Belgique

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

    Informations forums :
    Inscription : mars 2002
    Messages : 614
    Points : 1 380
    Points
    1 380
    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
    Nouveau membre du Club
    Femme Profil pro
    Demandeur d'emploi
    Inscrit en
    mars 2019
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Demandeur d'emploi

    Informations forums :
    Inscription : mars 2019
    Messages : 83
    Points : 34
    Points
    34

    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
    Modérateur

    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    13 557
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 13 557
    Points : 22 767
    Points
    22 767

    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
    614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : Belgique

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

    Informations forums :
    Inscription : mars 2002
    Messages : 614
    Points : 1 380
    Points
    1 380
    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