programme fonctionnel
Un programme fonctionnel Python contient les blocs suivants dans l’ordre :
Remarques
Il est important de respecter l’indentation dans les boucles et dans la définition des fonctions locales.
Le nom des variables doit être explicite.
L’utilisateur doit être guidé de façon précise.
![]() |
Les marques ‛*tag* ’ :
Une marque tag= ‛*texte* ’ est une chaîne de caractères que l’on peut associer à un objet crée dans un canevas. Lorsque can.tag_bind est appelée elle exécute la fonction associée au tag.
nettoie=can.create_text(x,2\*y,text=msg2,fill='red',tag='DE',font=ft) dessin=can.create_text(x,y,text=msg1,fill="blue",tag='UN' ,font=ft) changer=can.create_text(x,3\*y,text="MENU",fill="black",tag="TR",font=ft)Lorsque la souris est appelée pour commencer l’exécution de la fonction, la fonction lambda doit être munie d’un paramètre dont le nom est quelconque :
Pour le tag "UN " le paramètre est inutile Pour le tag "DE " le paramètre est utile. Pour un tag en général, je vous conseille le paramètre event.
can.tag_bind("UN","<Button-1>",lambda inutile:dessine(can,largeur,hauteur,1))
can.tag_bind("DE","<Button-1>",lambda utile:dessine(can,largeur,hauteur,2))
can.tag_bind("TR","<Button-1>",lambda event:menu(fenetre,can,largeur,hauteur))
DEPLACEMENT BALLE : |
---|
Pour déplacer un objet dans un canevas, il faut tenir compte du repère dans lequel évolue l’objet.
1202 deplacement balle.py
Voici l’exemple d’une balle de diamètre 30 qui se déplace du point \(\mathbf{(0,300)}\) au point \(\mathbf{(1000,300)}\).
La balle se déplace horizontalement ou verticalement et change de direction à chaque point.
Premier point : (0 ; 300 ), abscisse = 0 , ordonnée = 300. Deuxième point : (270 ;300), abscisse = 270 , ordonnée = 300. Troisième point : (270 ;300), abscisse =270 , ordonnée = 300 Quatrième point : ((530 ;170), abscisse =530 , ordonnée = 170 Cinquième point : (530 ;300), abscisse = 530 , ordonnée = 300. Sixième point : (1000 ; 300), abscisse = 0 , ordonnée = 300. |


Le code :
#1405 deplacement balle.py
from tkinter import *
from math import*
def avance(balle,x,y,x1,y1,x2,y2,dx,dy,rayon,largeur,hauteur):
# fait déplacer la balle horizontalement ou verticalemnt
avancer=0
x,y=x+dx,y+dy
if x+rayon+dx > largeur:
avancer=1# arret à la largeur
if x<x1 :
y= y
if x==x1:# deuxième point vertical haut
dx,dy=0,-5
if y==y1:dx,dy=5,0
if x>x1 and x<x2:y=y1# horizontal vers troisième point
if x==x2:# quatrième point point vertical bas
dx,dy=0,5
if y==y2:dx,dy=5,0# cinquième point
if x>x2:y=y2# horizontal
can.coords(balle,x-rayon,y-rayon,x+rayon,y+rayon)
if avancer ==0:
fenetre.after(20,lambda:avance(balle,x,y,x1,y1,x2,y2,dx,dy,rayon,largeur,hauteur))
def lancer_balle(x,y,x1,y1,x2,y2,dx,dy,rayon,largeur,hauteur,couleur):
#création de la balle et lancement
balle=can.create_oval(x,y,x+rayon,y+rayon,fill=couleur)
avance(balle,x,y,x1,y1,x2,y2,dx,dy,rayon,largeur,hauteur)
# -------------programme principal --------------------------------#
fenetre = Tk()
fenetre.title("Déplacement Balle")
fenetre.iconbitmap("logo-isn.ico")
#largeur=fenetre.winfo_screenwidth()-120
largeur=1000
#hauteur=fenetre.winfo_screenheight()-200
hauteur=500
fenetre.geometry(str(largeur)+'x'+str(hauteur+80))
fenetre.configure(bg='light blue')
couleur='red'
x,y,x1,y1,x2,y2,dx,dy,rayon=0,300,270,170,530,300,5,0,30
can=Canvas(fenetre,width=largeur,height=hauteur,bg='ivory')
can.grid(row=0,column=0,columnspan=2)
mur=can.create_rectangle(300,200,500,330,width=5,fill='green',outline='black')
sol=can.create_rectangle(0,330,largeur,330,fill='green',width=5)
b=Button(fenetre,text='Balle rouge',font='verdana 12 bold',fg='red',\
command=lambda:lancer_balle(x,y,x1,y1,x2,y2,dx,dy,rayon,largeur,hauteur,couleur) )
b.grid(row=1,column=0)
fenetre.mainloop()
DEPLACEMENT BALLE ET PLATEAU: |
---|
Exemple d’une balle qui saute au-dessus d’un plateau qui se déplace.
1406 animation saut d’objet.py
Le code :
# 1406 animation saut objet.py
from tkinter import *
import time, threading
from math import *
def deplacement_plateau(plateau,x,y,dx,dy,rayon,largeur):
#deplace l'image
if x+rayon+dx>largeur: # rebond à droite
x = 2*(largeur-rayon)-x
dx = -dx
if x-rayon+dx < 0:# rebond à gauche
x = 2*rayon-x
dx = -dx
x ,y= x+dx,y+dy
can.coords(plateau,x,y,x+100,y+45)#image en mouvement
fenetre.after(20,lambda:\
deplacement_plateau(plateau,x,y,dx,dy,rayon,largeur))
def deplacement_balle(balle,cord,gauche,droite,largeur,saut):
#deplace l'objet et detecte l'autre item
x,y,x0,y0=cord[0],cord[1],cord[2],cord[3]
dx,dy,rayon,degre=cord[4],cord[5],cord[6],cord[7]
if saut=="immobile":
x0,y0=coordonnees_item(2)#prend les coordonnées
if y0==1000: # l'image en mouvement (image cachée y=1000)
x0,y0=coordonnees_item(3)
if (x>x0 and x-x0<2.5*rayon):#detecte l'arrivée du plateau
saut,droite,gauche="gauche",False,True#à gauche
if (x<x0 and x0-x<2*rayon ):
saut,droite,gauche="droit",True,False #à droite
if saut=="gauche" or saut=="droit":x0,y0=x0,y0
if saut=="gauche" and gauche==True:#si le deplacement est vers la gauche
saut,a="gauche",0.17 #et le saut s'execute
x, y = int(x0+rayon -2*rayon*cos(degre*a)),int(y0 -2*rayon*sin(-degre*a))
if degre<38:
can.coords(balle,x,y,x+25,y+25)
degre=degre+1
cord=[x,y,x0,y0,dx,dy,rayon,degre]
fenetre.after(20,lambda:\
deplacement_balle(balle,cord,gauche,droite,largeur,"gauche"))
if degre==37: # fin du saut
can.coords(balle,x,y,x+25,y+25)
saut,y,droite="immobile",320,True
cord=[x,y,x0,y0,dx,dy,rayon,degre]
fenetre.after(20,lambda:\
deplacement_balle(balle,cord,gauche,droite,largeur,"immobile"))
elif saut=="droit" and droite==True:#si le deplacement est vers la droite
saut,a="droit",0.17 # et le saut s'execute
x, y = int(x0+1 +2*rayon*cos((-degre)*a)),int(y0 -2*rayon*sin((-degre)*a))
if degre<39:
can.coords(balle,x,y,x+25,y+25)
degre=degre+1
cord=[x,y,x0,y0,dx,dy,rayon,degre]
fenetre.after(20,lambda:\
deplacement_balle(balle,cord,gauche,droite,largeur,"droit"))
if degre==38: # fin du saut
can.coords(balle,x,y,x+25,y+25)
saut,y,gauche="immobile",320,True
cord=[x,y,x0,y0,dx,dy,rayon,degre]
fenetre.after(20,lambda:\
deplacement_balle(balle,cord,gauche,droite,largeur,"immobile"))
elif saut=="immobile":
degre=19
if x+rayon+dx>largeur: # la balle rebondit à droite
x = 2*(largeur-rayon)-x
dx=-dx
if x-rayon+dx < rayon:# la balle rebondit à gauche
x = 2*rayon+1
dx = -dx
x ,y= x+dx,y+dy
can.coords(balle,x,y,x+25,y+25)
cord=[x,y,x0,y0,dx,dy,rayon,degre]
fenetre.after(20,lambda:\
deplacement_balle(balle,cord,gauche,droite,largeur,"immobile"))
def coordonnees_item(k):
#retourne les coordonnées de l'item soit objet soit image
liste=can.find_all()
dim=len(liste)
coord=4*[]
w=liste[k]
coord=can.coords(w)
x=int(coord[0])
y=int(coord[1])
return x,y
#------ Programme principal -------
degre=19
fenetre = Tk()
largeur=600#fenetre.winfo_screenwidth()-120
fenetre.iconbitmap("logo-isn.ico") # change l'icone de la fenetr
fenetre.title(" Animation saut d'objet")# affiche le titre dans la fenetre
fenetre.geometry(str(largeur)+"x700") # redimensionne la fenetre
#largeur=fenetre.winfo_screenwidth()-120 # detecte la dimension de l'écran
hauteur=600 # determination des dimensions
can = Canvas(fenetre, width =largeur, height =hauteur, bg ='white')
balle=can.create_oval(largeur-120,320,largeur-100,340,fill="red")
ligne=can.create_line(0,345,largeur,345,width=4,fill='black')
can.grid(row =0, column =0, rowspan =3,columnspan=3 ,padx =0, pady =0)
bouton1 = Button(fenetre,text='Quitter',command=fenetre.destroy)
bouton1.grid(row=4,column=0)
plateau=can.create_rectangle(150,300,210,350,fill="blue",width=4)
deplacement_plateau(plateau,0,300,7,0,100,largeur)
x,y,x0,y0,dx,dy,rayon,degre=1000,320,0,320,5,0,53,degre
cord=[x,y,x0,y0,dx,dy,rayon,degre]
deplacement_balle(balle,cord,True,True,largeur-50,"immobile")
fenetre.mainloop()