Aide compréhension d'un exercice

[Fermé]
Signaler
-
Bonjour,

Je suis actuellement depuis un mois sur le livre de gerard swinnen sur python 3.
Je vais je pense très doucement, et j'essaye plus ou moins de m'en sortir seul ce qui parfois et compliqué.

Et la je suis sur tkinter mais je bloque vraiment je vous donner l'énoncer de l'exercice qui et le suivant :

8.12 Écrivez un programme qui fait apparaître une fenêtre avec un canevas. Dans ce canevas on
verra deux cercles (de tailles et de couleurs différentes), qui sont censés représenter deux
astres. Des boutons doivent permettre de les déplacer à volonté tous les deux dans toutes les
directions. Sous le canevas, le programme doit afficher en permanence : a) la distance séparant
les deux astres; b) la force gravitationnelle qu’ils exercent l’un sur l’autre (penser à afficher en
haut de fenêtre les masses choisies pour chacun d’eux, ainsi que l’échelle des distances). Dans
cet exercice, vous utiliserez évidemment la loi de la gravitation universelle de Newton (cf.
exercice 6.16, page 58, et un manuel de Physique générale).


J'ai réussi le fait de placer les boutons et mettre les déplacements, par contre ce qui et du reste blocage complet je n'arrive pas a affiché les formules ni rien.

J'ai donc regarder le correction et je crois que c'est pire clairement je ne comprend pas grand chose, et donc je n'avance pas car je me dit qu'il faut d'abord comprendre cela.

Quelqu'un aurait la possibilité de détailler un peut les choses ?
Par exemple dans la fonction avance il y'a "n,gb,hb" mais ou sont t'elles utilisés ?

Merci beaucoup


La correction :

# Simulation du phénomène de gravitation universelle
from tkinter import *
from math import sqrt
 Solutions des exercices 397

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(n, gd, hb):
 "déplacement de l'astre n, de gauche à droite ou de haut en bas"
 global x, y, step

 # nouvelles coordonnées :
 x[n], y[n] = x[n] +gd, y[n] +hb
 # 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 :
 step = di/10
def gauche1():
 avance(0, -step, 0)
def droite1():
 avance(0, step, 0)
def haut1():
 avance(0, 0, -step)
def bas1():
 avance(0, 0, step)
def gauche2():
 avance(1, -step, 0)
def droite2():
 avance (1, step, 0)
def haut2():
 avance(1, 0, -step)
def bas2():
 avance(1, 0, step)

# Masses des deux astres :
m1 = 6e24 # (valeur de la masse de la terre, en kg)
m2 = 6e24 #

astre = [0]*2 # liste servant à mémoriser les références des dessins
x =[50., 350.] # liste des coord. X de chaque astre (à l'écran)
y =[100., 100.] # liste des coord. Y de chaque astre
step =10 # "pas" de déplacement initial
# Construction de la fenêtre :
fen = Tk()

fen.title(' Gravitation universelle suivant Newton')
# Libellés :
valM1 = Label(fen, text="M1 = " +str(m1) +" kg")
valM1.grid(row =1, column =0)
valM2 = Label(fen, text="M2 = " +str(m2) +" kg")
valM2.grid(row =1, column =1)
valDis = Label(fen, text="Distance")
valDis.grid(row =3, column =0)
valFor = Label(fen, text="Force")
valFor.grid(row =3, column =1)
# Canevas avec le dessin des 2 astres:
can = Canvas(fen, bg ="light yellow", width =400, height =200)
can.grid(row =2, column =0, columnspan =2)
astre[0] = can.create_oval(x[0]-10, y[0]-10, x[0]+10, y[0]+10,
 fill ="red", width =1)
astre[1] = can.create_oval(x[1]-10, y[1]-10, x[1]+10, y[1]+10,
 fill ="blue", width =1)
# 2 groupes de 4 boutons, chacun installé dans un cadre (frame) :
fra1 = Frame(fen)
fra1.grid(row =4, column =0, sticky =W, padx =10)
Button(fra1, text="<-", fg ='red',command =gauche1).pack(side =LEFT)
Button(fra1, text="->", fg ='red', command =droite1).pack(side =LEFT)
Button(fra1, text="^", fg ='red', command =haut1).pack(side =LEFT)
Button(fra1, text="v", fg ='red', command =bas1).pack(side =LEFT)
fra2 = Frame(fen)
fra2.grid(row =4, column =1, sticky =E, padx =10)
Button(fra2, text="<-", fg ='blue', command =gauche2).pack(side =LEFT)
Button(fra2, text="->", fg ='blue', command =droite2).pack(side =LEFT)
Button(fra2, text="^", fg ='blue', command =haut2).pack(side =LEFT)
Button(fra2, text="v", fg ='blue', command =bas2).pack(side =LEFT)
fen.mainloop()

Configuration: Windows / Chrome 74.0.3729.169