memory

_images/titrevideo.PNG
html video by EasyHtml5Video.com v3.9.1
OBJECTIF :Code complet du programme

La deuxième partie consiste à mettre en pratique les commandes suivantes :

  • Afficher une fenêtre, avec un titre et une icône.
  • Déterminer la dimension de la fenêtre pour qu’elle puisse afficher des textes et des images.
  • Inclure dans la fenêtre un canevas (Canvas) pour afficher des images qui peuvent se déplacer à l’aide de la souris.
  • Modifier des images à l’aide du logiciel GIMP, de façon à faire un affichage original.
  • Utiliser les tableaux et les listes pour stocker des données.

On utilise l’interface graphique tkinter,

Mode d’emploi :

Il faut créer un dossier ‘/images ‘ dans le dossier ICN pour stocker les images.

Le nom des images doit être img0.png, img1.png, img2, img3.png,…,

Il faut créer un fichier image.py dans le dossier ICN qui va contenir les fonctions qui concernent les images.

_images/image1t.png
Utilisation du module tkinter

Charger le module : Pour utiliser le module tkinter, il faut d’abord choisir un mode d’importation :

from tkinter import * charge le module tkinter.

Ouvrir une fenêtre :

Module fenetre.py

Tk() : permet de désigner un premier objet (une fenêtre) duquel les autres dépendront.

Le nom (arbitrairement choisi) est déterminé par fenetre.

fenetre.title(titre”) : affiche le titre (chaîne de caractères) dans la fenêtre. (ligne 9)

fenetre.iconbitmap(icone): affiche un logo stocké dans un fichier image avec l’extension ”.ico” (dans le même dossier que le fichier python qui utilise l’icône). (ligne 10)

fenetre.geometry(taille) : précise une taille fixe de fenêtre. Dans le cas contraire, les dimensions de la fenêtre s’adaptent à son contenu. (Exemple :taille= ‘500x300’ , fabrique une fenêtre de 500 pixels de largeur et de 300 pixels de hauteur)

fenetre.mainloop() : lancera le gestionnaire d’événements. L’essentiel du script (sauf fonctions ou classes) doit se situer entre les deux, cela peut être considéré comme une boucle.

Dans la suite la fenêtre : fenetre=Tk()

fenetre.resizable(width=False,height=False)

Empêche le redimensionnement de la fenêtre.

#fenetre.py

#module de construction de fenetres

from tkinter import *

 

def creer_fenetre(fenetre,taille,titre):

      """modifie une fenêtre"""

      fenetre.title(titre)

      #fenetre.iconbitmap(icone)

      fenetre.geometry(taille)

      fenetre.resizable(height=False,width=False)

      return fenetre

 

def nettoie_fenetre(fenetre,can,liste_widgets):

      can.delete(ALL)  

      for w in liste_widgets:w.destroy()

      return fenetre,can     

 

Créer un canevas :

Pour afficher des images ou pour déplacer des objets sur une fenêtre on peut utiliser un canevas (Canvas)

_images/canvas.PNG

Déclaration :

can=Canvas(fenetre,width=largeur,height=hauteur,bg=couleur)

Affichage : La méthode grid est disponible sur le livre

can.grid(row=0,column=0,rowspan=3,columnspan=4)

Le rectangle canevas (can) va occuper 3 lignes et 4 colonnes à partir de la ligne 0 (row =0)

et de la colonne 0 (column = 0).

_images/grid.PNG
Créer une liste d’images :

Module image.py

#image.py

#module pour les images

#Fabrique une liste d'images

from tkinter import*

def creer_item(tim):

      "creation d'un item "

      #tim+'.png' ="inombre.png" (nombre =1;2;

      #ou 9 ou 10 ...

      p1=PhotoImage(file=tim+'.PNG')

      return p1

def liste_image(nombre):

      # Fonction qui permet de creer un liste qui

      #     comporte un nombre de photos

      items=nombre*['']

      for i in range(nombre):

            # le symbole / permet d'aller

            #chercher les images

            # dans le dossier images/

            tim='images/i'+str(i)

            items[i]=creer_item(tim)

      return items     

def taille_photo(photo):

      #Détermine la taille de la photo

      largeur=photo.width()

      hauteur=photo.height()

      return largeur,hauteur 

Ce module utilise les listes (items= [] ligne 15) cela permet d’utiliser toutes les images dans toutes les fonctions du programme.

Remarque : pour pouvoir intégrer facilement les images dans une liste, il faut leur donner un nom qui contient un nombre entier , cela permet à une boucle for in range(..,..) : de remplir correctement la liste.

Créer un programme qui modifie les images :

L’objectif est de cliquer consécutivement sur deux points d’interrogation, (ce qui fait retourner l’image)

Si les deux images sont identiques elles restent affichées.

_images/image7.PNG

#affiche memoire.py

from tkinter import *

from image import * #fichier image.py

from fenetre import*# fichier fenetre.py

from random import randrange

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 affiche_fond(can,l_image,l_nombre,ligne,colonne):

      #affiche le fond de la première febêtre

    l_items=[]

    for i in range(ligne):

        for j in range(colonne):

            B=can.create_image(j*cp+cp/2,i*lp+lp/2,image=l_image[0])

            l_items.append(B)

 

    return l_items

def click_souris(event,can,l_nombre,l_image,lp,cp,ligne,colonne,l_items,l_widgets,memoire,photos):

    #donne les coordonnées du click de la souris

    x,y=event.x,event.y

    ln=int(y)//lp#calcul de la ligne

    cn=int(x)//cp#calcul de la colonne

    k=ln*colonne+cn

    memoire[3]=memoire[3]+1

    score=memoire[3]

    #on vérifie si la première image est la même que la première

    changer,memoire,photos=verifie_memoire(can,l_nombre,l_image,lp,cp,ligne,colonne,l_items,memoire,photos,k)

    if memoire[2]==1:

        for i in range(3):memoire[i]=0

    if changer==True:

        change_image=l_image[l_nombre[k]]

        can.itemconfigure(l_items[k],image=change_image)

    l_widgets[3].configure(text=str(score))

 

def verifie_memoire(can,l_nombre,l_image,lp,cp,ligne,colonne,l_items,memoire,photos,k):

    #on vérifie si la première image est la même que la première

    change=False

    if photos[l_nombre[k]]==0 and k!= memoire[4]:

       

        if memoire[0]==1:

            memoire[4]=-1

            if l_nombre[k]==l_nombre[memoire[1]]:

                change=True

                photos[l_nombre[k]]=1

            else:

                change_image=l_image[0]

                can.itemconfigure(l_items[memoire[1]],image=change_image)

            memoire[2]=1

            memoire[1]=0

        if memoire[0]==0:

            memoire[1]=k

            memoire[0]=1

            memoire[4]=k

          

            change=True

        #la fonction retourne l'autorisation de changer l'image

        #et réinitialise la mémoire des données

    return change,memoire,photos

def melange(liste):

      " remplissage aléatoire d'une liste de  nombres entiers"

      numimage=len(liste)

      for i in range(numimage):liste[i]=2

      k=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  

                  k=k+1

      return liste

def quitter():

    fenetre.destroy()

#--------déclaration des variables---------------#

largeur,hauteur=525,420

ligne,colonne=4,5

l_widgets=[]

score=0

photos=11*[0]

memoire=[0,0,0,score,-1]

#lp=hauteur de chaque ligne en pixels

#cp=largeur de chaque colonne en pixels

lp,cp=int(hauteur/ligne),int(largeur/colonne)

#liste qui  va contenir les images

l_nombre=ligne*colonne*[0]#liste qui va contenir des nombres

#--------------création de la fenêtre------------#

fenetre = Tk()

couleur="light blue"

titre="Jeu de Mémoire "

taille=str(largeur+150)+'x'+str(hauteur)

creer_fenetre(fenetre,taille,titre,couleur)

#-création du canvas qui va contenir les données-#

can=Canvas(fenetre,width=largeur,height=hauteur)

#le canvas contient le nombre de lignes et de colonnes

#qui sont déclarées dans les variables

can.grid(row=0,column=0,rowspan=ligne,columnspan=colonne)

#affichage du fond d'écran

#------remplissage des  listes des données-------#

#il faut remplir la liste d'images dans la fenêtre

#sinon cela ne marche pas

l_image=liste_image(11)#contient 11 images dans cet exemple

l_nombre=melange(l_nombre)

for i in range(len(l_nombre)):

    l_nombre[i]=l_nombre[i]%10+1

#liste de nombres mélangés

l_items=affiche_fond(can,l_image,l_nombre,ligne,colonne)            

t1=Button(fenetre,text='Quitter',font='verdana 15 bold',width=2,bg='ivory',command=quitter)

t1.grid(row=3,column=6,sticky=W+E)

l_widgets.append(t1)

texte="Il faut cliquer\ndeux fois\n consécutivement\n sur la\n même image"

t2=Label(fenetre,text=texte,bg='light blue',font='verdana 10 bold' )

t2.grid(row=0,column=6,sticky=W+E)

l_widgets.append(t2)

t3=Label(fenetre,text="SCORE",bg='orange',font='verdana 20 bold')

t3.grid(row=1,column=6,sticky=W+E)

l_widgets.append(t3)

t4=Label(fenetre,text="",bg='orange',font='verdana 20 bold')

t4.grid(row=2,column=6,sticky=W+E)

l_widgets.append(t4)        

can.bind("<Button-1>",lambda event:click_souris(event,can,l_nombre,l_image,lp,cp,ligne,colonne,l_items,l_widgets,memoire,photos))

fenetre.mainloop()