PyGTK - Classe TreeView
Il widget Treeview mostra i contenuti di un modello che implementa l'interfaccia gtk.TreeModel. PyGTK fornisce i seguenti tipi di modelli:
- gtk.ListStore
- gtk.TreeStore
- gtk.TreeModelSort
ListStore è un modello di elenco. Quando è associato a un widget gtk.TreeView, produce una casella di riepilogo contenente gli elementi da cui selezionare. Un oggetto gtk.ListStore viene dichiarato con la seguente sintassi:
store = gtk.ListStore(column_type)
Un elenco può avere più colonne, le costanti di tipo predefinite sono:
- gobject.TYPE_BOOLEAN
- gobject.TYPE_BOXED
- gobject.TYPE_CHAR
- gobject.TYPE_DOUBLE
- gobject.TYPE_ENUM
- gobject.TYPE_FLOAT
- gobject.TYPE_INT
- gobject.TYPE_LONG
- gobject.TYPE_NONE
- gobject.TYPE_OBJECT
- gobject.TYPE_STRING
- gobject.TYPE_UCHAR
- gobject.TYPE_UINT
- gobject.TYPE_ULONG
- gtk.gdk.pixbuf ecc.
Ad esempio, un oggetto ListStore per memorizzare elementi stringa viene dichiarato come -
store = gtk.ListStore(gobject.TYPE_STRING
Per aggiungere articoli nel negozio, vengono utilizzati i metodi append ():
store.append (["item 1"])
TreeStore è un modello per il widget Albero a più colonne. Ad esempio, la seguente istruzione crea un negozio con una colonna con un elemento stringa.
Store = gtk.TreeStore(gobject.TYPE_STRING)
Per aggiungere elementi in un TreeStore, utilizzare il metodo append (). Il metodo append () ha due parametri, genitore e riga. Per aggiungere un elemento di primo livello, il genitore è Nessuno.
row1 = store.append(None, ['row1'])
È necessario ripetere questa istruzione per aggiungere più righe.
Per aggiungere righe figlie, passare la riga di livello superiore come parametro genitore al metodo append () -
childrow = store.append(row1, ['child1'])
È necessario ripetere questa istruzione per aggiungere più righe figlie.
Ora, crea un widget TreeView e usa l'oggetto TreeStore sopra come modello.
treeview = gtk.TreeView(store)
Ora dobbiamo creare TreeViewColumn per visualizzare i dati del negozio. L'oggetto di gtk.TreeViewColumn gestisce l'intestazione e le celle utilizzando gtk.CelRenderer. L'oggetto TreeViewColumn viene creato utilizzando il seguente costruttore:
gtk.TreeViewColumn(title, cell_renderer,…)
Oltre al titolo e al renderer, sono necessarie zero o più coppie attributo = colonna per specificare da quale colonna del modello di albero deve essere recuperato il valore dell'attributo. Questi parametri possono anche essere impostati utilizzando i metodi della classe TreeViewColumn indicati di seguito.
Un gtk.CellRenderer è una classe base per un insieme di oggetti per il rendering di diversi tipi di dati. Le classi derivate sono CellRendererText, CellRendererPixBuf e CellRendererToggle.
I seguenti metodi della classe TreeViewColumn vengono utilizzati per configurare il suo oggetto:
TreeViewColumn.pack_start (cell, expand = True) - Questo metodo racchiude l'oggetto CellRenderer nella colonna iniziale. Se il parametro di espansione è impostato su True, l'intero spazio allocato delle colonne viene assegnato alla cella.
TreeViewColumn.add_attribute (cella, attributo, colonna): questo metodo aggiunge una mappatura di attributi all'elenco nella colonna dell'albero. Ilcolumn è la colonna del modello ad albero.
TreeViewColumn.set_attributes () - Questo metodo imposta le posizioni degli attributi di renderer usando il attribute = column coppie
TreeViewColumn.set_visible () - If True, la colonna treeview è visibile
TreeViewColumn.set_title () - Questo metodo imposta la proprietà "title" sul valore specificato.
TreeViewColumn.set_lickable () - Se impostato su True, l'intestazione può essere selezionata dalla tastiera ed essere cliccata.
TreeViewColumn.set_alignment (xalign) - Questo metodo imposta la proprietà "alignment" sul valore di xalign.
Il segnale "cliccato" viene emesso quando l'utente fa clic sul pulsante di intestazione treeviewcolumn .
Dopo aver configurato l'oggetto TreeViewColumn, viene aggiunto al widget TreeView utilizzando il metodo append_column ().
I seguenti sono i metodi importanti della classe TreeView:
TreevVew.set_model () - Imposta la proprietà "model" per la visualizzazione ad albero. Se il treeview ha già un set di modelli, questo metodo lo rimuoverà prima di impostare il nuovo modello. Semodel è None, disinserirà il vecchio modello.
TreeView.set_header_clickable () - Se impostato su True, è possibile fare clic sui pulsanti del titolo della colonna.
TreeView.append_column (): aggiunge l'elemento specificato TreeViewColumn all'elenco delle colonne.
TreeView.remove_column (): rimuove la colonna specificata dalla visualizzazione ad albero.
TreeView.insert_column (): inserisce l'oggetto specificato column nella visualizzazione ad albero nella posizione specificata da position.
Il widget TreeView emette i seguenti segnali:
modificato con il cursore | Viene emesso quando il cursore si sposta o è impostato. |
espandere-comprimere-riga-cursore | Viene emesso quando la riga in corrispondenza del cursore deve essere espansa o compressa. |
attivato dalla riga | Viene emesso quando l'utente fa doppio clic su a treeview riga |
riga crollata | Viene emesso quando una riga viene compressa dall'utente o dall'azione programmatica. |
espanso per righe | Viene emesso quando una riga viene espansa tramite l'utente o l'azione programmatica. |
Di seguito vengono forniti due esempi del widget TreeView. Il primo esempio usa un ListStore per produrre un semplice ListView.
Qui viene creato un oggetto ListStore e gli elementi stringa vengono aggiunti ad esso. Questo oggetto ListStore viene utilizzato come modello per l'oggetto TreeView -
store = gtk.ListStore(str)
treeView = gtk.TreeView()
treeView.set_model(store)
Quindi un CellRendererText viene aggiunto a un oggetto TreeViewColumn e lo stesso viene aggiunto a TreeView.
rendererText = gtk.CellRendererText()
column = gtk.TreeViewColumn("Name", rendererText, text = 0)
treeView.append_column(column)
L'oggetto TreeView viene posizionato nella finestra di primo livello aggiungendolo a un contenitore fisso.
Esempio 1
Rispettare il codice seguente:
import pygtk
pygtk.require('2.0')
import gtk
class PyApp(gtk.Window):
def __init__(self):
super(PyApp, self).__init__()
self.set_title("TreeView with ListStore")
self.set_default_size(250, 200)
self.set_position(gtk.WIN_POS_CENTER)
store = gtk.ListStore(str)
store.append (["PyQt"])
store.append (["Tkinter"])
store.append (["WxPython"])
store.append (["PyGTK"])
store.append (["PySide"])
treeView = gtk.TreeView()
treeView.set_model(store)
rendererText = gtk.CellRendererText()
column = gtk.TreeViewColumn("Python GUI Libraries", rendererText, text=0)
treeView.append_column(column)
fixed = gtk.Fixed()
lbl = gtk.Label("select a GUI toolkit")
fixed.put(lbl, 25,75)
fixed.put(treeView, 125,15)
lbl2 = gtk.Label("Your choice is:")
fixed.put(lbl2, 25,175)
self.label = gtk.Label("")
fixed.put(self.label, 125,175)
self.add(fixed)
treeView.connect("row-activated", self.on_activated)
self.connect("destroy", gtk.main_quit)
self.show_all()
def on_activated(self, widget, row, col):
model = widget.get_model()
text = model[row][0]
self.label.set_text(text)
def main():
gtk.main()
return
if __name__ == "__main__":
bcb = PyApp()
main()
L'elemento selezionato dall'utente viene visualizzato su un'etichetta nella finestra come on_activated callback viene richiamata la funzione.
Esempio 2
Il secondo esempio crea un TreeView gerarchico da un TreeStore. Questo programma segue la stessa sequenza di costruzione del negozio, impostandolo come modello per TreeView, progettando una TreeViewColumn e aggiungendola a TreeView.
import gtk
class PyApp(gtk.Window):
def __init__(self):
super(PyApp, self).__init__()
self.set_title("TreeView with TreeStore")
self.set_size_request(400,200)
self.set_position(gtk.WIN_POS_CENTER)
vbox = gtk.VBox(False, 5)
# create a TreeStore with one string column to use as the model
store = gtk.TreeStore(str)
# add row
row1 = store.append(None, ['JAVA'])
#add child rows
store.append(row1,['AWT'])
store.append(row1,['Swing'])
store.append(row1,['JSF'])
# add another row
row2 = store.append(None, ['Python'])
store.append(row2,['PyQt'])
store.append(row2,['WxPython'])
store.append(row2,['PyGTK'])
# create the TreeView using treestore
treeview = gtk.TreeView(store)
tvcolumn = gtk.TreeViewColumn('GUI Toolkits')
treeview.append_column(tvcolumn)
cell = gtk.CellRendererText()
tvcolumn.pack_start(cell, True)
tvcolumn.add_attribute(cell, 'text', 0)
vbox.add(treeview)
self.add(vbox)
self.connect("destroy", gtk.main_quit)
self.show_all()
PyApp()
gtk.main()
Il seguente TreeView viene visualizzato come output: