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 :

Probleme exercice de Gerard Swinnen 8.13


Sujet :

Tkinter Python

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 12
    Points : 9
    Points
    9
    Par défaut Probleme exercice de Gerard Swinnen 8.13
    Bonjour, je suis en train de suivre le cours de Gerard Swinnen (enfin de son livre)

    Et j'en suis arrivé, tant bien que mal à l'exercice 8.13.
    Sauf que je n'arrive pas à faire que l'astre ce déplace lorsque je clique

    Je mets la partie du code concerné

    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
    def distance(x1, y1, x2, y2):
        "distance séparant les points x1,y1 et x2,y2"
        d = sqrt((x2-x1)**2 + (y2-y1)**2)       # théorème de Pythagore
        return  d
     
    def forceG(m1, m2, di):
        "force de gravitation s'exerçant entre m1 et m2 pour une distance di"
        return m1*m2*6.67e-11/di**2             # loi de Newton
     
    def avance(event):
        "déplacement de l'astre n, de gauche à droite ou de haut en bas"
        global x, y
        #nouvelles coordonnées :
        x[n], y[n] = event.x , event.y
        #déplacement du dessin dans le canevas :
        can.coords(astre[n], x[n]-10, y[n]-10, x[n]+10, y[n]+10)
        # calcul de la nouvelle interdistance : 
        di = distance(x[0], y[0], x[1], y[1])
        # conversion de la distance "écran" en distance "astronomique" :
        diA = di*1e9            # (1 pixel => 1 million de km) 
        # calcul de la force de gravitation correspondante :
        f = forceG(m1, m2, diA)
        # affichage des nouvelles valeurs de distance et force : 
        valDis.configure(text="Distance = " +str(diA) +" m")
        valFor.configure(text="Force = " +str(f) +" N")
        # adaptation du "pas" de déplacement en fonction de la distance :
     
    def astre1():
            global n
            n=0
     
    def astre2():
            global n
            n=1
    En précisant qu'il y a un bouton qui lance la fonction astre1 et un autre la fonction astre2*

    Normalement, je clique sur un bouton astre1 ou 2 et ensuite lorsque je clique sur le Canevas, ca place l'astre choisi à cet endroit et donne la Force et la Distance


    Le plus énervant c'est que le programme n'indique pas d'erreur

  2. #2
    Membre confirmé
    Avatar de vincent.mbg
    Homme Profil pro
    Développeur Python
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Python

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Points : 618
    Points
    618
    Par défaut
    Sauf que je n'arrive pas à faire que l'astre ce déplace lorsque je clique
    [...]
    Le plus énervant c'est que le programme n'indique pas d'erreur
    peut être que la fonction et mal relier à l'évènement sourie.
    Ajoute par exemple print("test") dans la fonction avance et regarde si ça affiche "test" quand clic

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    Edit: Résolu

    En fait c'était un problème de variable (d était utilisé plusieurs fois)

    J'ai juste recréée ma fonction pointeur(event), en lui demandant de lancer avance(event.x,event.y)

  4. #4
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 27
    Points : 23
    Points
    23
    Par défaut
    Bonjour, j'ai passé la nuit sur cet exercice (j'ai peur pour les autres exercices... mais bon)

    Voici ma solution si cela peut aider:

    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    from tkinter import *
    from math import sqrt
     
    def distance(x1,y1,x2,y2):
        "Distance séparant les points x1,y1 et x2,y2"
        d = sqrt((x2-x1)**2 + (y2-y1)**2)
        return d
     
    def forceG(m1,m2,di):
        "Force de gravitation s'exerçant entre m1 et m2 pour une distance di"
        return m1*m2*6.67e-11/di**2
     
    def pointeur(event):
        global x,y
        x[n],y[n] = event.x,event.y
        can.coords(astre[n],x[n]-10,y[n]-10,x[n]+10,y[n]+10)
     
        di = distance(x[0],y[0],x[1],y[1])
        diA = di*1e9
        f = forceG(m1,m2,diA)
        valDis.configure(text="Distance = "+str(diA)+" m")
        valFor.configure(text="Force = "+str(f)+" N")
     
    def astre1():
        global n
        n = 0
     
    def astre2():
        global n
        n = 1
     
    m1,m2 = 6e24,6e24
    x,y = [20.,50],[20.,20]
    astre = [0]*2
    n = 0
     
    fen = Tk()
    fen.title("Gravitation selon Newton")
     
    valDis = Label(fen,text="Distance")
    valDis.grid(row=1,column=1,padx=10,sticky=W)
    valFor = Label(fen,text="Force")
    valFor.grid(row=2,column=1,padx=10,sticky=W)
     
    can = Canvas(fen,bg="light grey",width=300,height=200)
    can.grid(row=0,column=1,columnspan=2,padx=10,pady=10)
     
    can.bind("<Button-1>",pointeur)
     
    astre[0] = can.create_oval(x[0]-10,y[0]-10,x[0]+10,y[0]+10,fill="red",width =2) 
    astre[1] = can.create_oval(x[1]-10,y[1]-10,x[1]+10,y[1]+10,fill="blue",width =2)
     
    Button(fen,text="Astre 1",command=astre1).grid(row=0,column=3,pady=10,sticky=N)
    Button(fen,text="Astre 2",command=astre2).grid(row=0,column=3,pady=40,sticky=N)
     
    fen.mainloop()
    Aussi, j'ai lus une autre solution sur ce forum que je mets ci-dessous je souhaiterais savoir laquelle est la plus souhaitable merci d'avance.

    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
    from Tkinter import *
     
    def place(event):
    	global ov
    	if ov == 'oval':
    		x = event.x
    		y = event.y
    		can.coords(oval, x, y, x +30, y +30)
    	if ov =='oval2':
    		x2 = event.x
    		y2 = event.y
    		can.coords(oval2, x2, y2, x2 +30, y2 +30)
     
    def select1():
    	global ov
    	ov = 'oval'
     
    def select2():
    	global ov
    	ov = 'oval2'
    #----------------
    x, y = 10, 10
    x2, y2 = 50, 10
     
    ov = 'oval'
    fen = Tk()
    fen.title("Exercice d'animation")
    can = Canvas(fen, bg='dark grey', height=300, width=300)
    can.pack(side=LEFT)
     
    oval = can.create_oval(x, y, x+30, y+30, width=2, fill='red')
    oval2 = can.create_oval(x2, y2, x2+30, y2+30, width=2, fill='green')
     
    can.bind("<Button-1>", place)
     
    Button(fen, text='Quitter', command=fen.quit).pack(side=BOTTOM)
    Button(fen, text='cercle rouge', command=select1).pack()
    Button(fen, text='cercle vert', command=select2).pack()
     
    fen.mainloop()

  5. #5
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonsoir,

    Comme dit dans votre dernier sujet ce tutoriel est fait pour apporter une logique.
    A vous de voir ce qui correspond en fait à ce que vous avez appris avant (structure du code ?). Quel code pensez vous le plus proche de ce qui est fait avant ?

    Ceci dit pensez a faire un sujet. Non pas que le sujet soit différent mais avec un résolu de 2009 et des codes différents vous aurez moins de réponses.

    @+

  6. #6
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 27
    Points : 23
    Points
    23
    Par défaut
    Merci de votre réponse.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. probleme exercice en ocaml
    Par alix30002000 dans le forum Caml
    Réponses: 8
    Dernier message: 11/10/2007, 16h08
  2. Obtenir la solution exercices du bouquin Swinnen
    Par rlejeune dans le forum Général Python
    Réponses: 1
    Dernier message: 26/08/2007, 04h53
  3. probleme exercice C++
    Par ludo86 dans le forum C++
    Réponses: 9
    Dernier message: 09/04/2007, 15h00
  4. Probleme exercice list
    Par Gebudi. dans le forum C++
    Réponses: 6
    Dernier message: 31/07/2006, 15h43
  5. problemes exercices sql
    Par siciliano_messinese dans le forum Langage SQL
    Réponses: 3
    Dernier message: 23/09/2005, 16h52

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