|
Chi ha programmato con le GTK sa che i widget per le liste ad albero sono programmati in modo
eccellente, dividendo la View dallo Store e dal Model. Questo però, può risultare molto complicato
per chi si trova alle prime armi, oppure troppo complesso quando i nostri scopi sono piuttosto limitati.
La classe SimpleTree permette di avere un'interfaccia semplice per la gestione delle liste, senza però limitare le sue potenzialità. Creazione Un breve esempio mostrerà meglio di 1000 parole il suo funzionamento: from simpletree import SimpleTree
from simpletree import SynchroList as SL
class Item:
def __init__(self, a, b):
self.a = a
self.b = b
data = SL([Item('hello', 'world'), Item('i am', 'alive')])
tree = SimpleTree()
tree.model = data
tree.set_cols(['a', 'b'])
OK, alcune cose possono in effetti apparire un pò oscure, andiamo a vederle.Innanzitutto stiamo creando una classe per le nostre righe: questo, benchè possa apparire noioso, dà una grande semplicità di utilizzo. Come previsto, l'attributo "a" sarà mostrato nella colonna "a", e l'attributo "b" sarà mostrato nella colonna "b". Notiamo anche che la nostra lista di dati non è una lista normale, ma una SL (SynchroList). La SL si comporta per l'utente come una normalissima lista, ma ha una potenzialità: quando viene modificata, il SimpleTree viene "avvisato", permettendo l'auto-aggiornamento. Il resto è abbastanza auto-esplicativo: creiamo i nostri dati, istanziamo un SimpleTree, gli associamo i dati, e impostiamo le colonne. Facile, no? Gestire il widget SimpleTree è un oggetto, non un widget. Dunque, quando dobbiamo mostrarlo nella nostra finestra, dobbiamo usare la TreeView associata ad esso, cioè tree.tv
Modificare i datiOra che abbiamo creato una lista, parliamo anche di come si modifica. Niente di più semplice: basta modificare la lista associata ("data")! La SL garantisce infatti che ad ogni modifica della lista corrisponda una modifica del tree. è comunque possibile usare il metodo tree.refresh() qualora ci fosse il bisogno di aggiornare
manualmente il contenuto del tree.Caratteristiche avanzate E se volessimo ramificare la nostra lista? Basta aggiungere una lista a data, per esempio con: data.append([Item('nodo', 'padre'), Item('figlio', 1), Item('figlio', 2)])Altro punto di forza di SimpleTree è la semplicissima gestione della selezione, sia singola(default) che multipla. Il path dell'elemento selezionato si ricava semplicemente con: path = tree.selectedI path sono delle liste di interi, che specificano il "percorso" da seguire per arrivare alla riga desiderata. Viene allora spontaneo chiedersi come possiamo applicare questo percorso a data: la risposta è nella potenza delle SL, che supportano liste come indici. ad esempio, SL[(1, 2, 3)] corrisponde a SL[1][2][3]Comodo, no? quindi basta fare: print data[sel]per stampare a video la riga desiderata. Gestire la selezione multipla è altrettanto semplice: essa va impostata con tree.select_mode = gtk.SELECTION_MULTIPLEe poi useremo lo stesso procedimento di prima, ricordando però che ora tree.selected non è più un path, ma una lista di path! Il nostro tree reagisce ad alcuni eventi standard: cliccare sulle intestazioni delle colonne, ad esempio, le riordinerà. Questa caratteristica può essere disattivata con: tree.sortable = Falseè possibile impostare dei filtri alla nostra view. Questo si ottiene modificando la classe delle righe, ed aggiungendo le funzioni che serviranno da filtro. Ad esempio, se creassimo un metodo short della
nostra classe Item che ritorna True se l'attributo "a" non supera i 5 caratteri,
potremmo definire un filtro che mostra solo le righe "short", con:tree.visibility = "short"e si disattiva con: tree.visibility = False |
![]()
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 2.0 Italy License.