tkinter, python e automi cellulari – life

lifeRiprendiamo l’esempio del gioco life, già visto in un precedente articolo, per esaminare l’utilizzo della libreria tkinter del python. Questa libreria permette l’utilizzo della GUI in questo linguaggio.

Il codice integrale di questo esempio è disponibile a questo indirizzo; riporto qui solo gli stralci relativi alla libreria tkinter.

Il corpo principale del programma inizia ovviamente importando i moduli necessari:

import random
from tkinter import *

random per la generazione casuale della configurazione iniziale e tkinter per la GUI.

Viene poi richiesta la dimensione della tabella che si vuole gestire e, a seguire, creato un oggetto CellularAutoma.

dim = input( "Inserisci la dimensione della board: ")
board = CellularAutoma( int(dim) )

CellularAutoma è la classe su cui si basa tutto l’applicativo e, oltre a contenere una tabella (lista di liste per la precisione) con i dati dell’ultimo stato del sistema definisce i metodi per rappresentarlo graficamente (show) e calcolare lo stato successivo (evolve).

board.show()

while True:
   board.evolve( )
   board.show()
   board.master.update()

Il programma, come si vede, contiene poco più che chiamate a questi metodi; infatti, dopo lo show della configurazione iniziale, entra in un loop nel quale viene calcolato lo stato successivo, viene mostrato a video lo stato e si utilizza la funzione update della libreria per permettere al ciclo di procedere e non rimanere bloccato nei loop degli eventi dell’interfaccia grafica.

Passiamo ora ad esaminare la classe: non entreremo nel dettaglio di tutti i metodi, come detto, perché alcuni di questi non hanno differenze rilevanti dalle funzioni esaminate nel precedente articolo sul gioco life.

La struttura della classe è:

class CellularAutoma:
   def __init__(self, lenght=6):
      """genera la tabella iniziale quadrata e di dimensione iniziale lenght"""
      self.board = [[]]
 
   def evolve( self ):
      """esegue lo step di evoluzione del gioco life su una tabella sferica"""
 
   def show( self ):
      """Gives a representation of the data"""

Esaminiamo ora i metodi iniziando dal costruttore dove oltre all’inizializzazione dei dati, che qui non vediamo nel dettaglio ma che si basa sulla generazione di numeri casuali, viene anche creato un’oggetto per la GUI:

   def __init__(self, lenght=6):
      """genera la tabella iniziale quadrata e di dimensione iniziale lengoht"""
      self.board = [[]]
      
      [...]

      #inizializzo ambiente grafico 
      self.master = Tk()
      self.master.title('life game')
      self.w = Canvas(self.master, width=lenght*10, height=lenght*10)
      self.w.pack()

Viene infatti inizializzato l’ambiente grafico creando un oggetto della classe Tk, assegnato un nome alla finestra, aggiunto un oggetto immagine (Canvas) alla finestra e infine si utilizza il metodo pack() per organizzare gli oggetti nella finestra. In questo caso la chiamata a pack()  è relativamente utile essendoci solamente un oggetto canvas nella finestra.

Non entro nei dettagli del metodo evolve che non è coinvolto nella rappresentazione grafica.

Segue infine il metodo show() che rappresenta graficamente lo stato del sistema.

   def show( self ):
      self.w.delete(ALL)
      for i,v in enumerate(self.board):
         for j,w in enumerate( self.board[i] ):
            if (self.board[i][j] == 0):
               self.w.create_rectangle(i*10, j*10, i*10+10, j*10+10, fill="blue")
            else:
               self.w.create_rectangle(i*10, j*10, i*10+10, j*10+10, fill="yellow")

Anche in questo caso la libreria tkinter rende le cose piuttosto seplici; abbiamo infatti un loop su tutti gli elementi della tabella e andreamo a rappresentare sul nostro oggetto canvas un quadrato blu per le celle vuote ed un quadrato giallo per quelle piene. La funzione che utilizziamo in questo caso è

create_rectangle(x0, y0, x, y, fill="yellow")

La delete() a inizio metodo serve a rimuovere gli oggetti creati in precedenza.

La libreria tkinter mi permette quindi di definire una GUI perfettamente funzionale con pochi passi:

  • definisco un oggetto GUI
  • ne specifico gli elementi grafici
  • controllo il flusso del programma con mainloop, update e funzioni per la gestione dei vari eventi che è necessario controllare

Abbiamo visto qui un esempio di utilizzo della libreria tkinter, documentazione più completa è disponibile nella documentazione ufficiale di python.

One thought on “tkinter, python e automi cellulari – life

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *