Programme fonctionnel

Programme fonctionnel

  • déplacement balle
  • deplacement balle et plateau
  • 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()