« Programmation Python/Utilisation de fenêtres et de graphismes » : différence entre les versions

Contenu supprimé Contenu ajouté
Tavernier (discussion | contributions)
solution
Tavernier (discussion | contributions)
solution
Ligne 926 :
 
<li>Écrivez un programme qui montre un canevas dans lequel est dessiné un circuit électrique simple (générateur + interrupteur + résistance). La fenêtre doit être pourvue de champs d'entrée qui permettront de paramétrer chaque élément (c'est-à-dire choisir les valeurs des résistances et tensions). L'interrupteur doit être fonctionnel (Prévoyez un bouton « Marche/arrêt » pour cela). Des « étiquettes » doivent afficher en permanence les tensions et intensités résultant des choix opérés par l'utilisateur.</li>
</ol>
{{solution}}
<ol>
<li>
<pre>
# Simulation du phénomène de gravitation universelle
 
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) # 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()
</pre>
[[Image:Apprendre à programmer avec Python 73.png|center|capture d'écran du résultat final]]
</li>
<li>Réfléchissez !</li>
<li>Réfléchissez !</li>
<li>Réfléchissez !</li>
<li>
<pre>
# Conversions de températures Fahrenheit <=> Celsius
 
from Tkinter import *
 
def convFar(event):
"valeur de cette température, exprimée en degrés Fahrenheit"
tF = eval(champTC.get())
varTF.set(str(tF*1.8 +32))
def convCel(event):
"valeur de cette température, exprimée en degrés Celsius"
tC = eval(champTF.get())
varTC.set(str((tC-32)/1.8))
fen = Tk()
fen.title('Fahrenheit/Celsius')
 
Label(fen, text='Temp. Celsius :').grid(row =0, column =0)
# "variable Tkinter" associée au champ d'entrée. Cet "objet-variable"
# assure l'interface entre TCL et Python (voir notes, page 165) :
varTC =StringVar()
champTC = Entry(fen, textvariable =varTC)
champTC.bind("<Return>", convFar)
champTC.grid(row =0, column =1)
# Initialisation du contenu de la variable Tkinter :
varTC.set("100.0")
 
Label(fen, text='Temp. Fahrenheit :').grid(row =1, column =0)
varTF =StringVar()
champTF = Entry(fen, textvariable =varTF)
champTF.bind("<Return>", convCel)
champTF.grid(row =1, column =1)
varTF.set("212.0")
 
fen.mainloop()
</pre>
[[Image:Apprendre à programmer avec Python 74.png|center|capture d'écran du résultat final]]
</li>
<li>Réfléchissez !</li>
<li>Voir ci dessous.</li>
<li>Voir ci dessous.</li>
<li>
<pre>
# Cercles et courbes de Lissajous
 
from Tkinter import *
from math import sin, cos
 
def move():
global ang, x, y
# on mémorise les coord. précédentes avant de calculer les nouvelles :
xp, yp = x, y
# rotation d'un angle de 0.1 radian :
ang = ang +.1
# sinus et cosinus de cet angle => coord. d'un point du cercle trigono.
x, y = sin(ang), cos(ang)
# Variante déterminant une courbe de Lissajous avec f1/f2 = 2/3 :
# x, y = sin(2*ang), cos(3*ang)
# mise à l'échelle (120 = rayon du cercle, (150,150) = centre du canevas)
x, y = x*120 + 150, y*120 + 150
can.coords(balle, x-10, y-10, x+10, y+10)
can.create_line(xp, yp, x, y, fill ="blue")
ang, x, y = 0., 150., 270.
fen = Tk()
fen.title('Courbes de Lissajous')
can = Canvas(fen, width =300, height=300, bg="white")
can.pack()
balle = can.create_oval(x-10, y-10, x+10, y+10, fill='red')
Button(fen, text='Go', command =move).pack()
 
fen.mainloop()
</pre>
[[Image:Apprendre à programmer avec Python 75.png|center|capture d'écran du résultat final]]
</li>
<li>Réfléchissez !</li>
<li>Réfléchissez !</li>
</ol>
{{fin}}