MVC e Python + GTK, seconda parte

Ri-eccomi sull’argomento, prima di cominciare voglio ringraziare l’autore del framework in questione, Roberto Cavada, per aver commentato l’articolo precedente.

Nella prima puntata di questo tutorial avevo promesso di mostrarvi una piccola applicazione di esempio, Todoman, utile per comprendere in modo più approfondito il funzionamento di Pygtkmvc.

L’applicazione gestisce delle liste ToDo e consente all’utente di inserire, modificare e eliminare i task a proprio piacimento.

Ma basta chiacchiere e partiamo subito alla scoperta delle numerose funzionalità offerte dal framework. Innanzitutto analizziamo il modello di dominio e partiamo con una delle classi principali (come al solito, i commenti sono embedded):

import gtkmvc, gtkmvc.model

class ToDoListModel(gtkmvc.model.TreeStoreModel):

"""

Rappresenta la lista dei task.

La classe estende un modello di vista ad albero,

in modo da velocizzare la sua rappresentazione.

"""

# Questo dizionario contiene gli attributi

# "observable", ogni modifica apportata

# alle proprietà verrà notificata in modo

# automatico. Nel corpo dei metodi della

# classe si potrà accedere a tali proprietà

# come a qualsiasi altra variabile di istanza.

__properties__ = { ‘name’ : ”, ‘author’ : ” }

def __init__(self):

"""

Costruttore della classe.

Richiama il costruttore della classe base, passandogli

come parametri il tipo di ognuna delle quattro colonne

del widget TreeStore.

"""

gtkmvc.model.TreeStoreModel.__init__(self, int, str, str, ‘gboolean’)

self.__setup_properties() # inizializza i widget

def __setup_properties(self):

"""

Inizializza i widget grafici.

"""

self.name = _("Unnamed todo list")

self.author = _("Unknown author")

def get_todo_by_path(self, path):

"""

T.get_todo_by_path(path) -> todo — inizializza un nuovo task con le informazioni presenti nella vista ad albero

"""

ta = ToDoItemModel()

ta.name = self[path][columns[‘NAME’]]

ta.priority = self[path][columns[‘PRIORITY’]]

ta.description = self[path][columns[‘DESCRIPTION’]]

ta.done = self[path][columns[‘DONE’]]

return ta

def has_item(self, item_name):

"""

T.has_item(item_name) -> bool — restituisce True se nella vista ad albero è presente una riga con la stesso valore nella colonna ‘NAME’, False altrimenti

"""

found = False

for i in self:

if i[columns[‘NAME’]] == item_name:

found = True

break

return found

def append_todo(self, todo):

"""

T.append(todo) — inserisce un oggetto nella lista

"""

self.append(None, [

todo.priority,

todo.name,

todo.description,

todo.done])

def clear(self):

"""

T.clear() — cancella il contenuto della lista

"""

gtkmvc.TreeStoreModel.clear(self)

self.__setup_properties()

Quelli che seguono sono gli indici delle colonne che desideriamo mostrare nel widget GtkTreeView:

# Contiene gli indici delle colonne della vista ad albero.

columns = { ‘PRIORITY’ : 0,

‘NAME’ : 1,

‘DESCRIPTION’ : 2,

‘DONE’ : 3 }

Una volta definita la lista, possiamo occuparci degli elementi che dovrà contenere:

class ToDoItemModel(gtkmvc.model.Model):

"""

Rappresenta i task.

La classe contiene delle proprietà testuali, numeriche e booleane,

perciò estende un semplice modello generico.

"""

__properties__ = {‘name’ : ”, ‘priority’ : 0, ‘description’ : ”, ‘done’ : False}

def __init__(self):

"""

Costruttore della classe.

"""

gtkmvc.model.Model.__init__(self)

self.__setup_properties()

self.treestore = None # relazione 1-a-1 con la lista che lo contiene

def __setup_properties(self):

"""

Inizializza i widget grafici.

"""

self.name = "Unnamed todo item" # nome di default

self.description = ""

self.done = False

self.priority = 5

def set_treestore(self, treestore):

"""

T.set_treestore(treestore) — imposta la vista ad albero nella quale è elencato.

"""

self.treestore = treestore

Infine, poichè desideriamo salvare su file le nostre liste todo, definiamo una versione serializzabile del tipo lista:

class ToDoListModelSerializable(ToDoListModel):

"""

Questa è la versione serializzabile della classe

ToDoListModel, fornisce i metodi necessari per la

scrittura e la lettura della configurazione su file.

"""

SECTION_TODOLIST_DETAILS = ‘Todolist details’

OPTION_TODOLIST_NAME = ‘Name’

Page 1 of 3 | Next page