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 -