programme-fonctionnel

Un programme fonctionnel Python contient les blocs suivants dans l’ordre :

_images/exemple.PNG

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.

_images/image236.png  

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))
webm converter by EasyHtml5Video.com v3.9.1
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. _images/horizontal.PNG
_images/image239.png _images/image240.png
video mp4 by EasyHtml5Video.com v3.9.1

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()