Mémory

OBJECTIF :Code complet du programme

Télécharger memory3 téléchargement  pour Clara Mahieu .

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

#fenetre.py

#module fenetre

from tkinter import*

def creer_fenetre(fenetre,taille,titre,couleur):

      #fonction qui redimensionne, donne le titre

      #et l'icône de la fenêtre ainsi que la couleur

      fenetre.geometry(taille) # redimensionne la fenêtre

      fenetre.title(titre)  # affiche le titre dans la fenêtre

      fenetre.configure(bg=couleur)# change la couleur du fond

def nettoie_fenetre(fenetre,can,liste_widgets):

      #nettoie la fenetre

      can.delete(ALL)

      for w in liste_widgets:w.destroy()

      return fenetre

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.

Variables

# 2021_affiche_memoire.py

#importation des modules

from tkinter import *

from image import * #fichier image.py

from fenetre import*# fichier fenetre.py

from random import randrange

 

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

l_c=[]#liste qui contient les boutons

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

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

Créer un canevas

1 style="text-align: center;background:#FFFFFF"> :

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

Variables

# 2021_affiche_memoire.py

#importation des modules

from tkinter import *

from image import * #fichier image.py

from fenetre import*# fichier fenetre.py

from random import randrange

 

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

l_c=[]#liste qui contient les boutons

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

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

Créer une liste d’images

Module image.py

.

Programme liste d'images

#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= [] ) 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 affiche les images

Ce programme est transitoire il permet d’afficher les images proposées dans le dossier images

.

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.

.

Tout d’abord on va donner la liste des fonctions qui sont nécessaires :

.

programme Résultat

# 2021_affiche_memoire.py

#importation des modules

from tkinter import *

from image import * #fichier image.py

from fenetre import*# fichier fenetre.py

from random import randrange

def Tableau(ligne,colonne):

    pass

def affiche_fond(can,l_image,l_nombre,ligne,colonne):

    pass

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

    pass

def jouer(fenetre,can,l_image,l_nombre,ligne,colonne,l_widgets):

    pass

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

    pass

def melange(liste):

    pass

def quitter():

    pass

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

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

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

jouer(fenetre,can,l_image,l_nombre,ligne,colonne,l_widgets)

fenetre.mainloop()

_images/image7.png

Puis le programme principal

Script

# 2021_affiche_memoire.py

#importation des modules

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,l_c,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_c[2].configure(text="SCORE\n"+str(score))

def jouer(fenetre,can,l_image,l_nombre,ligne,colonne,l_widgets):

    global score,memoire

    score=0

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

    fenetre=nettoie_fenetre(fenetre,can,l_widgets)

    l_c[2].configure(text="SCORE\n      .")

    l_nombre=melange(l_nombre)

    for i in range(len(l_nombre)):

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

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

    can.bind("<Button-1>",lambda event:\

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

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)

l_c=[]#liste qui contient les boutons

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

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

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

RE="REJOUER"

V10='verdana 10 bold'

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

V20='verdana 20 bold'

t1=Label(fenetre,text=V15,bg='light blue',font=V10 )

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

l_c.append(t1)

t2=Button(fenetre,text=RE,font='verdana 15 bold',width=2,bg='ivory')

t2.bind("<Button-1>",lambda event:jouer(fenetre,can,l_image,l_nombre,ligne,colonne,l_widgets))

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

l_c.append(t2)

t3=Label(fenetre,text="SCORE\n            .",bg='orange',font=V10)

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

l_c.append(t3)

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

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

l_c.append(t4)

jouer(fenetre,can,l_image,l_nombre,ligne,colonne,l_widgets)

fenetre.mainloop()


educationdunumerique.fr. Tous  droits réservés. D Pérarnaud Limoges.