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.

Les marques tag :

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

Programme fonctionnel :

_images/programmefonctionnel01.PNG
_images/programmefonctionnel02.PNG
_images/programmefonctionnel03.PNG
_images/programmefonctionnel04.PNG
# 1101 programme fonctionnel.py # ----------Importation des modules-----# from tkinter import * from math import * import time #--------Définition des fonctions----------# def creer_fenetre(fenetre,taille,titre): #construit la fenêtre fenetre.geometry(taille) fenetre.title(titre) #fenetre.iconbitmap(icone) return fenetre def nettoie_canevas(donnees): #nettoie le canevas donnees[1].delete(ALL) def dessine_canevas(donnees,a): #dessine dans le canevas nettoie_canevas(donnees) ft="arial 40 bold" f,c,l,h=donnees[0],donnees[1],donnees[2],donnees[3] liste1=[15,15,30,50,l-50,h/2-80,l-10,20,35,h-30,35,h-50,l-70,h/2-30] liste=[10,10,10,h/2,l-10,h-40,l-10,10,l-30,10,l-30,h-45,50,h/2,20,10] if a==1: c.create_rectangle(10,10,l-10,h-10,fill="khaki") c.create_polygon(liste,fill="red",outline="gold",smooth=1) t_menu=c.create_text(l/2,3*h/4,text="MENU",fill="red",tag="ZERO",font=ft) c.tag_bind("ZERO", "<Button-1>",lambda utile:affiche_exemple(donnees)) if a==2: c.create_rectangle(10,10,l-10,h-10,fill="pale green") c.create_polygon(liste1,fill="blue",outline="gold",smooth=1) t_menu=c.create_text(l/2,3*h/4,text="MENU",fill="red",tag="ZERO",font=ft) c.tag_bind("ZERO", "<Button-1>",lambda inutile:affiche_exemple(donnees)) def quitter(donnees): #fermeture de la fenêtre donnees[0].destroy() def affiche_exemple(donnes): #Exemple de menu où il suffit de cliquer sur le texte #donnees=[fenetre,can,largeur,hauteur] f,c,l,h=donnees[0],donnees[1],donnees[2],donnees[3] nettoie_canevas(donnees) cl,ft,ta,tn="yellow","arial 40 bold","Affiche dessin 1!","Affiche dessin 2!" me="MENU" t_nettoie=c.create_text(l/2,2*h/4,text=tn,fill=cl,tag='DEUX' ,font=ft) t_dessin=c.create_text(l/2,h/4,text=ta,fill="yellow",tag='UN' ,font=ft) t_quitter=c.create_text(l/2,3*h/4,text="Quitter",fill="red",tag="TROIS",font=ft) c.tag_bind("UN", "<Button-1>",lambda inutile:dessine_canevas(donnees,1)) c.tag_bind("DEUX", "<Button-1>",lambda inutile:dessine_canevas(donnees,2)) c.tag_bind("TROIS", "<Button-1>", lambda utile:quitter(donnees)) #----------Programme Principal-------------# fenetre=Tk() fenetre.title('Programme type') largeur=int(fenetre.winfo_screenwidth()/4) hauteur=int(fenetre.winfo_screenheight()/3) taille=str(largeur)+"x"+str(hauteur) creer_fenetre(fenetre,taille,"Programme fonctionnel") can=Canvas(fenetre,width=largeur,height=hauteur,bg='light blue') can.grid(row=0,column=0) donnees=[fenetre,can,largeur,hauteur] f,c,l,h=donnees[0],donnees[1],donnees[2],donnees[3] ft="arial 40 bold" t_menu=c.create_text(l/2,3*h/4,text="MENU",fill="red",tag="ZERO",font=ft) c.tag_bind("ZERO", "<Button-1>",lambda utile :affiche_exemple(donnees)) fenetre.mainloop()

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

DEPLACEMENT BALLE ET PLATEAU:

_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* from fenetre import* def avance(balle,x,y,parametres,dx,dy,largeur,hauteur): """fait déplacer la balle horizontalement ou verticalement""" avancer=0 rayon=parametres[6] x1,y1=parametres[0],parametres[1] x2,y2=parametres[2],parametres[3] 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,parametres,dx,dy,largeur,hauteur)) def lancer_balle(x,y,parametres,dx,dy,largeur,hauteur,couleur): """création de la balle et lancement """ rayon=parametres[6] if x<500: balle=can.create_oval(x,y,x+rayon,y+rayon,fill=couleur) avance(balle,x,y,parametres,dx,dy,largeur,hauteur) def creer_fenetre(fenetre,taille,titre,couleur): #construit la fenêtre fenetre.geometry(taille) fenetre.title(titre) fenetre.configure(bg=couleur) fenetre.resizable(height=False,width=False) #fenetre.iconbitmap(icone) return fenetre # -------------programme principal --------------------------# titre="Déplacement Balle" largeur,hauteur=1000,500 taille=str(largeur)+'x'+str(hauteur+80) couleur='light blue' #------------------------------------------------------------# fenetre = Tk() fenetre=creer_fenetre(fenetre,taille,titre,couleur) couleur='red' x,y,x1,y1,x2,y2,dx,dy,rayon=0,300,270,170,530,300,5,0,30 parametres=[x1,y1,x2,y2,dx,dy,rayon] 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') b.config(command=lambda:lancer_balle(x,y,parametres,dx,dy,largeur,hauteur,couleur) ) b.grid(row=1,column=0) fenetre.mainloop()

Exemple de pacman.

_images/programmefonctionnel05.PNG
_images/programmefonctionnel06.PNG

1404 animation pacman.py

Le code :

from random import * from tkinter import * from math import * #import os #bibliothèque pour le travail sur les dossier #from PIL.Image import * #from PIL import Image def remplir(tableau,liste,ligne,colonne): #remplissage du tableau par une liste for ln in range(0,ligne): for cn in range(0,colonne): tableau[ln][cn]=liste[colonne*ln+cn] return tableau def melange(liste,numimage,nombre): " remplissage aléatoire d'une liste de larg0 nombres entiers" for i in range(0,numimage):liste[i]=2 k,compt=0,0 while k<numimage-1: remelange=False numero=randrange(0,numimage) for j in range(0,numimage): if numero==liste[j] :remelange=True if remelange==False: liste[k]=numero if numero%nombre==0: compt=compt+1 k=k+1 return liste,compt def listetableau(liste,tableau,ligne,colonne): "fabrication d'une liste avec un tableau lignes colonnes" #remplissage d'une liste for ln in range(0,ligne): for cn in range(0,colonne): liste[colonne*ln+cn]=tableau[ln][cn] return liste def creerfenetre(titre ,taille): "modifie une fenêtre" fenetre.title(titre) fenetre.geometry(taille) return fenetre def Tableau(ligne,colonne): "fabrication d'un tableau lignes colonnes" #fabrication du tableau tableau=ligne*[0] for ln in range(ligne):tableau[ln]=colonne*[0] return tableau def creeritem(tim): "creation d'un item " p1=PhotoImage(file=tim+'.png') return p1 def creeritems(): items=larg2*[''] for i in range(larg2): tim='items/i'+str(i+1) items[i]=creeritem(tim) return items def creerimage(tim): "creation d'un item " p1=PhotoImage(file='imgpac/'+tim+'.png') return p1 def creerimages(numimage): images=numimage*[''] for i in range(numimage): tim=str(i+1) images[i]=creerimage(tim) return images def avancer(b1,b2,fenetre,can,images,tableau,tableau2,listetemp,ligne,colonne,b4,larg,compteur,xc,yc): global tableau3 x5,y5=cherche5(tableau3,ligne,colonne) cn,ln=x5+b1,y5+b2 largeur,hauteur=colonne*larg,ligne*larg if cn<0 or cn==colonne: b1=-b1 ln=y5+b1 if ln==ligne or ln<0: b2=-b2 cn=x5+b2 if (ln>=0 and ln<ligne) and (cn>=0 and cn<colonne): if tableau3[ln][cn]%4!=0: can.create_rectangle((cn)*larg,(ln)*larg,(cn+1)*larg,(ln+1)*larg,fill='light blue',outline='light blue') can.create_oval((cn)*larg+3,(ln)*larg+3,(cn+1)*larg-3,(ln+1)*larg-3,fill='red') can.create_rectangle(x5*larg,y5*larg,(x5+1)*larg,(y5+1)*larg,fill='light blue',outline='light blue') x1,y1=cn,ln for i in range(20): xt,yt=xc[i],yc[i] xc[i],yc[i]=x1,y1 x1,y1=xt,yt if tableau[ln][cn]%7==0: tableau3[ln][cn]=1 tableau2[ln][cn]=1 listetemp=listetableau(listetemp,tableau2,ligne,colonne) for i in range(nombre): if listetemp[i]==1: compteur=int(compteur+1) b4.configure(text=str(compteur)) temp=tableau[ln][cn] tableau3[ln][cn]=4 tableau3[y5][x5]=temp if compteur>0: if compteur<10: nt=compteur fin=nt+1 else: nt=9 fin=10 if compteur==1: can.create_rectangle(xc[1]*larg,yc[1]*larg,(xc[1]+1)*larg,(yc[1]+1)*larg,fill='gold',outline='light green') can.create_text(xc[1]*larg+larg/2,yc[1]*larg+larg/2,text="1",fill='red',font="verdana 8 bold") can.create_rectangle(xc[2]*larg,yc[2]*larg,(xc[2]+1)*larg,(yc[2]+1)*larg,fill='light blue',outline='light blue') if compteur>1: for i in range(1,nt+2): x1,y1=xc[i],yc[i] if i<nt: can.create_rectangle(x1*larg,y1*larg,(x1+1)*larg,(y1+1)*larg,fill='light green',outline='light green') can.create_text(x1*larg+larg/2,y1*larg+larg/2,text=str(i),fill='red',font="verdana 8 bold") if i==nt: can.create_rectangle(x1*larg,y1*larg,(x1+1)*larg,(y1+1)*larg,fill='gold',outline='light green') can.create_text(x1*larg+larg/2,y1*larg+larg/2,text=str(compteur),fill='red',font="verdana 8 bold") x1,y1=xc[fin],yc[fin] tableau3[y1][x1]=1 can.create_rectangle((x1)*larg,(y1)*larg,(x1+1)*larg,(y1+1)*larg,fill='light blue',outline='light blue') tableau3[ln][cn]=4 tableau=tableau3 def touche(event,fenetre,can,images,tableau,tableau1,listetemp,ligne,colonne,b4,larg,compteur,xc,yc): code=event.keycode if code==38: # Up avancer(0,-1,fenetre,can,images,tableau,tableau1,listetemp,ligne,colonne,b4,larg,compteur,xc,yc) elif code==40: # Down avancer(0,1,fenetre,can,images,tableau,tableau1,listetemp,ligne,colonne,b4,larg,compteur,xc,yc) elif code==37: #Left avancer(-1,0,fenetre,can,images,tableau,tableau1,listetemp,ligne,colonne,b4,larg,compteur,xc,yc) elif code==39: #Right avancer(1,0,fenetre,can,images,tableau,tableau1,listetemp,ligne,colonne,b4,larg,compteur,xc,yc) def deplacer(fenetre,images,tableau,tableau1,listetemp,liste,ligne,colonne,b5,larg): global tableau3 tableau=tableau3 x5,y5=cherche6(tableau,ligne,colonne) compteur1=0 nombre=ligne*colonne lr=0 if x5==0: cr=randrange(0,2) elif x5==colonne-1: cr=randrange(0,2)-1 elif x5>0 and x5< colonne-1: cr=randrange(0,3)-1 if abs(cr)==0: if y5==0: lr=randrange(0,2) elif y5>0 and y5< ligne-1: lr=randrange(0,3)-1 elif y5==ligne-1: lr=-1*randrange(0,2)-1 ln,cn=y5+lr,x5+cr if tableau[ln][cn]%7==0 and tableau[ln][cn]%4!=0 : if tableau1[ln][cn]==0: tableau1[ln][cn]=1 listetemp=listetableau(listetemp,tableau1,ligne,colonne) for i in range(nombre): if listetemp[i]==1: compteur1=int(compteur1+1) b5.configure(text=str(compteur1)) regarder(fenetre,images,ln,cn,x5,y5,tableau,larg,compteur1) if liste[0]==0: can.create_rectangle(cn*larg,ln*larg,cn*larg+larg,ln*larg+larg,fill="light blue",outline="light blue") if liste[0]==1: fenetre.after(200,lambda:deplacer(fenetre,images,tableau,tableau1,listetemp,liste,ligne,colonne,b5,larg)) def regarder(fenetre,images,ln,cn,x5,y5,tableau,larg,compteur1): global tableau3 if tableau[ln][cn]%4!=0 : if x5>=cn:pacmang(can,ln,cn,larg) else:pacman(can,ln,cn,larg) if x5!=cn or y5!=ln: can.create_rectangle(x5*larg,y5*larg,x5*larg+larg,y5*larg+larg,fill="light blue",outline="light blue") tableau[ln][cn]=19 tableau[y5][x5]=1 tableau[ln][cn]=19 tableau3=tableau def pacman(can,ln,cn,larg): can.create_oval(cn*larg+3,ln*larg+3,cn*larg+larg-3,ln*larg+larg-3,fill='light blue',outline='light blue') can.create_arc(cn*larg+3,ln*larg+3,cn*larg+larg-3,ln*larg+larg-3,fill="yellow",outline="black",start=25,extent=305) can.create_oval(larg*cn+larg/2,larg*ln+larg/3,larg*cn+larg/2+3,larg*ln+larg/3-3,fill="black",outline="black") def pacmang(can,ln,cn,larg): can.create_oval(cn*larg+3,ln*larg+3,cn*larg+larg-3,ln*larg+larg-3,fill='light blue',outline='light blue') can.create_arc(cn*larg+3,ln*larg+3,cn*larg+larg-3,ln*larg+larg-3,fill="yellow",outline="black",start=205,extent=305) can.create_oval(larg*cn+larg/2,larg*ln+larg/3,larg*cn+larg/2+3,larg*ln+larg/3-3,fill="black",outline="black") def creerlabel(fenetre,can,images,tim): "creation d'un item " p1=Label(can,image=images[tim]) return p1 def creerlabels(fenetre,can,numimage,images): labels=numimage*[''] for i in range(numimage): tim=i labels[i]=creerlabel(fenetre,can,images,tim) return labels def cherche5(tableau,ligne,colonne): "recherche l'emplacement de la case qui bouge" for ln in range(0,ligne): for cn in range(0,colonne): if tableau[ln][cn]==4: x,y=cn,ln return x,y def cherche6(tableau,ligne,colonne): "recherche l'emplacement de la case qui bouge" for ln in range(0,ligne): for cn in range(0,colonne): if tableau[ln][cn]==19: x,y=cn,ln return x,y def nettoie_fenetre(fenetre,can,liste_widgets): can.delete(ALL) for w in liste_widgets:w.destroy() return fenetre,can def jouer(fenetre,can,ligne,colonne,listen,images,compteur,liste,nombre,larg,liste_widgets): global tableau3 num=0 listetemp=nombre*[0] fenetre,can=nettoie_fenetre(fenetre,can,liste_widgets) can.grid(row=0,column=0,rowspan=ligne,columnspan=colonne) listen,compt=melange(listen,nombre,6) tableau1=Tableau(ligne,colonne) tableau1=remplir(tableau1,listetemp,ligne,colonne) tableau2=Tableau(ligne,colonne) tableau2=remplir(tableau2,listetemp,ligne,colonne) tableau3=Tableau(ligne,colonne) tableau3=remplir(tableau3,listen,ligne,colonne) tableau=Tableau(ligne,colonne) tableau=remplir(tableau,listen,ligne,colonne) b2=Label(fenetre,text="PACMAN se déplace\n tout seul\net mange les oeufs",bg="light blue",font="verdana 10 bold") b2.grid(row=1,column=colonne+1,columnspan=2) liste_widgets.append(b2) b3=Label(fenetre,text="oeufs mangés =",bg='light blue',font="verdana 10 bold") b3.grid(row=2,column=colonne+1) liste_widgets.append(b3) b4=Label(fenetre,text="0",bg='light blue',font="verdana 10 bold") liste_widgets.append(b4) b4.grid(row=2,column=colonne+2) b36=Label(fenetre,text="oeufs mangés\npacman =",bg='light blue',font="verdana 10 bold") b36.grid(row=4,column=colonne+1) liste_widgets.append(b3) b5=Label(fenetre,text="0",bg='light blue',font="verdana 10 bold") liste_widgets.append(b4) b5.grid(row=4,column=colonne+2) for ln in range(0,ligne): for cn in range(0,colonne): if tableau[ln][cn]%4==0: item=can.create_rectangle(cn*larg+1,ln*larg+1,(cn+1)*larg-1,(ln+1)*larg-1,fill='blue') if tableau[ln][cn]%7==0 and tableau[ln][cn]%4!=0: num=num+1 item=can.create_oval(cn*larg+7,ln*larg+3,(cn+1)*larg-7,(ln+1)*larg-3,fill='light green') if tableau[ln][cn]==4: can.create_rectangle(cn*larg+1,ln*larg+1,(cn+1)*larg-1,(ln+1)*larg-1,fill='light blue',outline='light blue') can.create_oval(cn*larg+3,ln*larg+3,cn*larg+larg-3,ln*larg+larg-3,width=2,fill='red',outline='red') if tableau[ln][cn]==19: pacmang(can,ln,cn,larg) liste[0]=1 xc=num*[0] yc=num*[0] x5,y5=cherche6(tableau,ligne,colonne) cn,ln=x5,y5 compteur=0 yc[0],xc[0]=y5,x5 fenetre.bind_all('<Key>', lambda event:touche(event,fenetre,can,images,tableau,tableau2,listetemp,ligne,colonne,b4,larg,compteur,xc,yc)) deplacer(fenetre,images,tableau,tableau1,listetemp,liste,ligne,colonne,b5,larg) fenetre=Tk() liste_widgets=[] colonne,ligne=20,12 larg=50 nombre=ligne*colonne largeur,hauteur=int(colonne*larg),int(ligne*larg) listen=nombre*[0] vert=[0,0,0] listetemp=nombre*[0] fenetre=creerfenetre("Jeu snake",str(largeur+230)+"x"+str(hauteur)) fenetre.configure(bg='light blue') compteur=0 can=Canvas(fenetre,width=largeur,height=hauteur,bg='light blue') can.grid(row=0,column=0,rowspan=ligne,columnspan=colonne) images=0 b1=Button(fenetre,text="JOUER",bg="light green",font="verdana 20 bold", command=lambda:jouer(fenetre,can,ligne,colonne,listen,images,compteur,vert,nombre,larg,liste_widgets)) b1.grid( row=0,column=colonne+1,columnspan=2) liste_widgets.append(b1) for ln in range(0,ligne): for cn in range(0,colonne): pacman(can,ln,cn,larg) item1=can.create_text(largeur/2,hauteur/2,text=" PACMAN ",font="verdana 60 bold",fill="red") item1=can.create_text(largeur/2,hauteur/2+100,text=" se déplace ",font="verdana 20 bold",fill="red") fenetre.mainloop()