BoySka


italian english
Boyska
|--News
|--+Progetti
|  |--SimpleTree()
|  |--JpegBug()
|  |--AntiSmileySpam()
|  |--OpenScout()
|--Codes
|--Files
|--Links
|--Contatti
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 dati
Ora 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.selected
I 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_MULTIPLE
e 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



Valid HTML 4.01 Transitional Valid CSS! Get Debian Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 2.0 Italy License.