GTK3 – Tree e List – I

Sì, ispirato a GEB.

Sì, ispirato a GEB.

TreeView serve a visualizzare dati. Con i suoi componenti è possibile:

  • l’aggiornamento automatico quando si aggiungono, cancellano e modificano dati;
  • supporto del drag & drop;
  • ordinamento;
  • supporto di widget embedded (check box, progress bar, ect.);
  • riordinare e ridimensionare le colonne;
  • filtrare i dati.

Non è che sia proprio facile, anzi. Anche perché i metodi sono numerosi.

Il modello

Ogni TreeView deve avere un modello associato, che può essere usato per più TreeView. Benché sia possibile implementarne uno ex-novo conviene usare Gtk.ListStore (semplici righe di dati, senza children) o  Gtk.TreeStore (ogni riga può avere uno o più children).
Ance se TreeStore mi sembra non usabile lo racconto perché strettamente collegato con ListStore.

Quando si costruisce un modello si deve specificare il tipo di dato per ogni colonna, es: store = Gtk.ListStore(str, str, float)
qui tre colonne, due di stringhe e una di float.

Per aggiungere dati:
treeiter = store.append(["The Art of Computer Programming", "Donald E. Knuth", 25.46])

Una volta che i dati sono inseriti è possibile accederli usando l’iter e la colonna:
print store[treeiter][2] # Prints value of third column
store[treeiter][2] = 42.15

Si usa la len() di Python.
Per stampare il numero di colonne: print(len(store))
Per stampare tutte le colonne tranne la prima: print(store[treeiter][1:])
Per stampare l’ultima colonna: print(store[treeiter][-1])
Modificare le prime due colonne: store[treeiter][:2] = ["Donald Ervin Knuth", 41.99]

Per stampare tutto:

for row in store:
    print(row[:])

Nota: print nella versione 3.x di Python è una funzione, le parentesi sono richieste.

Se si usa Gtk.TreeStore il codice precedente itera solo a livello di colonne principali, non nei children dei nodi. Per percorrere tutte le righe e i loro children usare print_tree_store().

def print_tree_store(store):
    rootiter = store.get_iter_first()
    print_rows(store, rootiter, "")

def print_rows(store, treeiter, indent):
    while treeiter != None:
        print indent + str(store[treeiter][:])
        if store.iter_has_child(treeiter):
            childiter = store.iter_children(treeiter)
            print_rows(store, childiter, indent + "\t")
        treeiter = store.iter_next(treeiter)

Ritrovare il path che punta alla sesta riga:
path = Gtk.TreePath(5)
treeiter = liststore.get_iter(path)

Trovare il valore nella seconda colonna:
value = liststore.get_value(treeiter, 1)

Oggetti di TreeModel

class Gtk.TreeModel

get_iter(path)
ritorna un’istanza a Gtk.TreeIter che punta a path. path è una stringa "10:4:0" o una tupla (10,4,0).

iter_next(treeiter)
ritorna un’istanza a Gtk.TreeIter che punta al nodo successivo a treeiter o None se non esiste.

iter_previous(treeiter)
come il precedente ma per il precedente.

get_iter_first()
ritorna un’istanza a Gtk.TreeIter che punta al primo nodo, quello con path "0" o None se il tree è vuoto.

Oggetti ListStore

class Gtk.ListStore(data_type[, ...])
crea una nuova classe Gtk.ListStore con le colonne con i tipi di dati specificati.

append([row])
aggiunge una riga. row è la lista dei dati per ogni colonna, se omessa o None viene aggiunta una riga vuota.
Ritorna un Gtk.TreeIter che punta alla riga aggiunta.

Oggetti di TreeStore

class Gtk.TreeStore(data_type[, ...])
gli argomenti sono gli stessi di Gtk.ListStore.

append(parent[, row])
come per ListStore. Se parent non è None la lista viene aggiunta dopo l’ultimo child di parent, altrimenti al top level.
Ritorna un Gtk.TreeIter che punta alla riga aggiunta.

Oggetti TreePath

class Gtk.TreePath(path)
costruisce un Gtk.TreePath che punta a path. path è una stringa Gtk.TreePath("10:4:0") o una tupla Gtk.TreePath([10, 4, 3]).

OK, per oggi basta, poi si continua 😉

Annunci
Post a comment or leave a trackback: Trackback URL.

Trackbacks

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger hanno fatto clic su Mi Piace per questo: