drosofff
7/3/2016 - 10:43 AM

From https://forum.ubuntu-fr.org/viewtopic.php?id=24296

from Tkinter import *
from random import *
from threading import Thread
import time

class MenuBar(Frame):
    """Barre de menus déroulants"""
    def __init__(self, boss=None):
        Frame.__init__(self, borderwidth =2)
        ##### Menu <Fichier> #####
        fileMenu = Menubutton(self, text ='motif')
        fileMenu.pack(side =LEFT)
        # Partie "déroulante" :
        me1 = Menu(fileMenu)
        me1.add_command(label ='alea', underline =0, command = boss.motif1)
        me1.add_command(label ='rpentomino', underline =0, command = boss.motif2)
        me1.add_command(label ='tpentomino', underline =0, command = boss.motif3)
        me1.add_command(label ='planeur', underline =0, command = boss.motif4)
        me1.add_command(label ='locomotive', underline =0, command = boss.motif6)
        me1.add_command(label ='vaisseau', underline =0, command = boss.motif5)
        me1.add_command(label ='Effacer', underline =0, command = boss.effacer)
        me1.add_command(label ='Terminer', underline =0, command = boss.quit)
        # Intégration du menu :
        fileMenu.configure(menu = me1)
        
class Fenetre(Frame):
    def __init__(self):
        Frame.__init__(self)
        self.master.geometry("350x350")
        self.master.title(" Jeu de la vie")
        self.jeu =Panneau(self)
        mBar = MenuBar(self.jeu)
        mBar.pack()
        self.jeu.pack(expand =YES, fill=BOTH, padx =0, pady =0)
        self.pack()

class Panneau(Frame, Thread):
    """Panneau de jeu (grille de n x m cases)"""
    def __init__(self, boss =None):
        self.ligne=70
        self.colonne=50
        Frame.__init__(self)
        Thread.__init__(self)
        # Canevas :
        self.can =Canvas(self,width=350, height =350, borderwidth =0)
        # Liaison de l'evenement <clic de souris> a son gestionnaire :
        self.can.bind("<Button-1>", self.clic)
        self.can.pack()
        
        self.cell =[] # construction d'une liste de listes
        self.tabcell=[]
        for i in range(self.ligne): # equivalente a un tableau
            self.cell.append([0]*self.ligne) # de x lignes x x colonnes)
            self.tabcell.append([0]*self.ligne)

         #self.motif("alea")
        self.start()
        
    def motif1(self):
        self.effacer()
        element=[1,0]
        for j in range(self.colonne) :
            for i in range(self.ligne):
                self.cell[i][j]=choice(element)
        self.update()
        
    def motif2(self):
        self.effacer()
        #r-pentomino
        self.cell[26][25]=1
        self.cell[24][26]=1
        self.cell[25][26]=1
        self.cell[26][26]=1
        self.cell[25][27]=1
        self.update()
        
    def motif3(self):
        self.effacer()
        #t-pentomino
        self.cell[24][36]=1
        self.cell[25][36]=1
        self.cell[26][36]=1
        self.cell[25][37]=1
        self.update()
        
    def motif4(self):
        self.effacer()
        #planeur
        self.cell[5][6]=1
        self.cell[6][7]=1
        self.cell[7][5]=1
        self.cell[7][6]=1
        self.cell[7][7]=1
        self.update()
        
    def motif5(self):
        self.effacer()
        #vaisseau spatial
        self.cell[26][26]=1
        self.cell[27][27]=1
        self.cell[23][28]=1
        self.cell[27][28]=1
        self.cell[24][29]=1
        self.cell[25][29]=1
        self.cell[26][29]=1
        self.cell[27][29]=1
        self.update()
        
    def motif6(self):
        self.effacer()
        #locomotive à vapeur
        self.cell[23][26]=1
        self.cell[26][26]=1
        self.cell[27][27]=1
        self.cell[23][28]=1
        self.cell[27][28]=1
        self.cell[24][29]=1
        self.cell[25][29]=1
        self.cell[26][29]=1
        self.cell[27][29]=1

        self.cell[23][33]=1
        self.cell[24][34]=1
        self.cell[25][34]=1
        self.cell[25][35]=1
        self.cell[25][36]=1
        self.cell[24][37]=1
                
        self.cell[23][40]=1
        self.cell[26][40]=1
        self.cell[27][41]=1
        self.cell[23][42]=1
        self.cell[27][42]=1
        self.cell[24][43]=1
        self.cell[25][43]=1
        self.cell[26][43]=1
        self.cell[27][43]=1                
        self.update()

    def update(self):
        for j in range (self.colonne):
               for i in range (self.ligne):
                   if self.cell[i][j]==1:
                       self.tabcell[i][j]=self.can.create_rectangle((i*6),(j*6),(i*6)+4,(j*6)+4,fill="black")
                   else :
                       self.tabcell[i][j]=self.can.create_rectangle((i*6),(j*6),(i*6)+4,(j*6)+4,fill="white")
         
    def run(self):
        while 1:
            for j in range (self.colonne):
                for i in range (self.ligne):
                    if self.cell[i][j]==1:
                        self.can.itemconfigure(self.tabcell[i][j],fill="black")
                    else :
                        self.can.itemconfigure(self.tabcell[i][j],fill="white")
            self.evolution()            
            time.sleep(0.1)
            
    def effacer(self):
        for j in range(self.colonne) :
            for i in range(self.ligne):
                self.cell[i][j]=0
        #effacer !
        self.can.delete(ALL)
        
    def evolution(self):
        #buffer
        self.c =[]
        for i in range(self.ligne): # equivalente a un tableau
            self.c.append([0]*self.ligne) # de x lignes x x colonnes)
            
        #for j in range(self.colonne) :
           # for i in range(self.ligne):
              #  self.c[i][j]=self.cell[i][j] # construction d'une liste de listes
        
        for j in range(self.colonne) :
            for i in range(self.ligne):
                cpt=0
                self.c[i][j]=self.cell[i][j] # remplissage du buffer
                #regles de conway
                #case precedente et suivante
                if self.cell[(self.ligne+i-1)%self.ligne][j]==1:
                    cpt=cpt+1
                if self.cell[(self.ligne+i+1)%self.ligne][j]==1:
                    cpt=cpt+1
                #ligne precedente
                if self.cell[(self.ligne+i-1)%self.ligne][(self.colonne+j-1)%self.colonne]==1:
                    cpt=cpt+1
                if self.cell[i][(self.colonne+j-1)%self.colonne]==1:
                    cpt=cpt+1
                if self.cell[(self.ligne+i+1)%self.ligne][(self.colonne+j-1)%self.colonne]==1:
                    cpt=cpt+1
                #ligne suivante
                if self.cell[(self.ligne+i-1)%self.ligne][(self.colonne+j+1)%self.colonne]==1:
                    cpt=cpt+1		
                if self.cell[i][(self.colonne+j+1)%self.colonne]==1:
                    cpt=cpt+1
                if self.cell[(self.ligne+i+1)%self.ligne][(self.colonne+j+1)%self.colonne]==1:
                    cpt=cpt+1
                #resolution des regles
                if (self.cell[i][j]==1 and (cpt==2 or cpt==3) ) :
                    self.c[i][j]=1
                else :
                    if (self.cell[i][j]==0 and cpt==3) :
                        self.c[i][j]=1
                    else :
                        self.c[i][j]=0
        #self.cell=self.c
        for j in range(self.colonne) :
            for i in range(self.ligne):
                self.cell[i][j]=self.c[i][j] # construction d'une liste de listes
                        
    def clic(self, event):
        #evenement souris
        print "clic clic"        
        
if __name__ == '__main__':
    Fenetre().mainloop()