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