PyGTK - Classe TreeView

O widget Treeview exibe o conteúdo de um modelo que implementa a interface gtk.TreeModel. O PyGTK fornece os seguintes tipos de modelos -

  • gtk.ListStore
  • gtk.TreeStore
  • gtk.TreeModelSort

ListStore é um modelo de lista. Quando associado a um widget gtk.TreeView, ele produz uma caixa de listagem contendo os itens a serem selecionados. Um objeto gtk.ListStore é declarado com a seguinte sintaxe -

store = gtk.ListStore(column_type)

Uma lista pode ter várias colunas, as constantes de tipo predefinidas são -

  • 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 etc.

Por exemplo, um objeto ListStore para armazenar itens de string é declarado como -

store = gtk.ListStore(gobject.TYPE_STRING

Para adicionar itens na loja, métodos append () são usados ​​-

store.append (["item 1"])

TreeStore é um modelo para widget Árvore com várias colunas. Por exemplo, a instrução a seguir cria uma loja com uma coluna contendo item de string.

Store = gtk.TreeStore(gobject.TYPE_STRING)

Para adicionar itens em um TreeStore, use o método append (). O método append () tem dois parâmetros, pai e linha. Para adicionar um item de nível superior, o pai é Nenhum.

row1 = store.append(None, ['row1'])

Você precisa repetir esta instrução para adicionar várias linhas.

Para adicionar linhas filhas, passe a linha de nível superior como parâmetro pai para o método append () -

childrow = store.append(row1, ['child1'])

Você precisa repetir esta instrução para adicionar várias linhas filho.

Agora, crie um widget TreeView e use o objeto TreeStore acima como modelo.

treeview = gtk.TreeView(store)

Agora temos que criar TreeViewColumn para exibir os dados da loja. O objeto de gtk.TreeViewColumn gerencia o cabeçalho e as células usando gtk.CelRenderer. O objeto TreeViewColumn é criado usando o seguinte construtor -

gtk.TreeViewColumn(title, cell_renderer,…)

Além do título e do renderizador, são necessários zero ou mais pares de atributo = coluna para especificar de qual coluna do modelo de árvore o valor do atributo deve ser recuperado. Esses parâmetros também podem ser definidos usando métodos da classe TreeViewColumn fornecidos abaixo.

Um gtk.CellRenderer é uma classe base para um conjunto de objetos para renderizar diferentes tipos de dados. As classes derivadas são CellRendererText, CellRendererPixBuf e CellRendererToggle.

Os seguintes métodos da classe TreeViewColumn são usados ​​para configurar seu objeto -

  • TreeViewColumn.pack_start (cell, expand = True) - Este método compacta o objeto CellRenderer na coluna inicial. Se o parâmetro de expansão for definido como True, todo o espaço alocado das colunas será atribuído à célula.

  • TreeViewColumn.add_attribute (célula, atributo, coluna) - Este método adiciona um mapeamento de atributo à lista na coluna da árvore. ocolumn é a coluna do modelo de árvore.

  • TreeViewColumn.set_attributes () - Este método define as localizações dos atributos do renderer usando o attribute = column pares

  • TreeViewColumn.set_visible () - Se True, a coluna treeview é visível

  • TreeViewColumn.set_title () - Este método define a propriedade "title" para o valor especificado.

  • TreeViewColumn.set_lickable () - se definido como True, o cabeçalho pode receber o foco do teclado e ser clicado.

  • TreeViewColumn.set_alignment (xalign) - Este método define a propriedade "alinhamento" com o valor de xalign.

O sinal "clicado" é emitido quando o usuário clica no botão do cabeçalho treeviewcolumn .

Após ter configurado o objeto TreeViewColumn, ele é adicionado ao widget TreeView usando o método append_column ().

A seguir estão os métodos importantes da classe TreeView -

  • TreevVew.set_model () - Isso define a propriedade "model" para a visualização em árvore. Se a visualização em árvore já tiver um modelo definido, este método o removerá antes de definir o novo modelo. E semodel é None, ele irá desconfigurar o modelo antigo.

  • TreeView.set_header_clickable () - Se definido como True, os botões do título da coluna podem ser clicados.

  • TreeView.append_column () - Acrescenta o especificado TreeViewColumn à lista de colunas.

  • TreeView.remove_column () - Isso remove a coluna especificada da exibição em árvore.

  • TreeView.insert_column () - Insere o especificado column na visualização em árvore no local especificado por position.

O widget TreeView emite os seguintes sinais -

cursor alterado Isso é emitido quando o cursor se move ou é definido.
expand-collapse-cursor-row Isso é emitido quando a linha no cursor precisa ser expandida ou recolhida.
ativado por linha Isso é emitido quando o usuário clica duas vezes em um treeview linha
enfileirado É emitido quando uma linha é recolhida pelo usuário ou ação programática.
linha expandida Isso é emitido quando uma linha é expandida por meio do usuário ou ação programática.

Dois exemplos do widget TreeView são fornecidos a seguir. O primeiro exemplo usa um ListStore para produzir um ListView simples.

Aqui, um objeto ListStore é criado e itens de string são adicionados a ele. Este objeto ListStore é usado como modelo para o objeto TreeView -

store = gtk.ListStore(str)

treeView = gtk.TreeView()
treeView.set_model(store)

Em seguida, um CellRendererText é adicionado a um objeto TreeViewColumn e o mesmo é anexado a TreeView.

rendererText = gtk.CellRendererText()
column = gtk.TreeViewColumn("Name", rendererText, text = 0)
treeView.append_column(column)

O objeto TreeView é colocado na janela de nível superior adicionando-o a um contêiner Fixo.

Exemplo 1

Observe o seguinte código -

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()

O item selecionado pelo usuário é exibido em um rótulo na janela como o on_activated callback função é invocada.

Exemplo 2

O segundo exemplo constrói um TreeView hierárquico a partir de um TreeStore. Este programa segue a mesma sequência de construção da loja, definindo-a como modelo para TreeView, desenhando uma TreeViewColumn e anexando-a 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()

O seguinte TreeView é exibido como uma saída -