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: