terça-feira, 27 de maio de 2014

Criando Tree View com Gtk+ e Python

   Quebrei muito a cabeça sobre como criar e configurar uma TreeView, até que depois de muita pesquisa na internet e muito consultar a documentação oficial do GTK+ acabei conseguindo.
    Vou tentar explicar como se faz, mas o faço presumindo que você já tenha um conhecimento básico sobre Python e Gtk+
    Vejamos o código abaixo:

 #!/usr/bin/python3  
 #-*- coding: utf-8 -*-  
   
 from gi.repository import Gtk  
   
 class Janela_com_a_treeView(object):  
     def __init__(self):  
           
         modelo_treeView = Gtk.ListStore(str, int)  
         treeView = Gtk.TreeView(model = modelo_treeView)  
   
         coluna_nome = Gtk.TreeViewColumn('Nome', Gtk.CellRendererText(), text = 0)  
         coluna_idade = Gtk.TreeViewColumn('Idade', Gtk.CellRendererText(), text = 1)  
   
         treeView.append_column(coluna_nome)  
         treeView.append_column(coluna_idade)  
   
         lista_nomes = [['Marcio', 30], ['Isabela', 20], ['Jurandir', 50]]  
         for nomes in lista_nomes:  
             modelo_treeView.append(nomes)  
   
         modelo_treeView.append(['Jassira', 99])  
         modelo_treeView.append(['Ziraldo', 120])  
   
         janela = Gtk.Window(title = 'Janela contendo a TreeView')  
         janela.set_default_size(300, 300)  
         janela.connect('delete-event', Gtk.main_quit)  
         janela.add(treeView)  
         janela.show_all()  
   
 Janela_com_a_treeView()  
   
 Gtk.main()  



    Esse código cria uma janela medindo 300 x 300 pixel contendo uma Tree View; A Tree View por sua vez contém duas colunas, coluna Nome, e Coluna Idade. Tentei fazer-lo o mais simples possível, usando o mínimo de widgets para não complicar...

  • Criando a Tree View:


    Note que quando criamos uma Tree View, temos que associar-la à um modelo, pois é no modelo que inserimos os dados.

        modelo_treeView = Gtk.ListStore(str, int) => Aqui criamos o modelo para a Tree View.

       treeView = Gtk.TreeView(model = modelo_treeView) => Aqui Criamos a Tree View e inserimos o modelo usando 'model = modelo_treeView'. 

    Também poderíamos fazer de outra forma:

        modelo_treeView = Gtk.ListStore(str, int)
        treeView = Gtk.TreeView()
        treeView.set_model(modelo_treeView)


    Eu particularmente prefiro a primeira forma, mas o resultado é o mesmo.

    Ainda sobre o modelo, note que entre os parênteses temos que definir o tipo de dado que será inserido na coluna. No exemplo, a coluna_nome irá receber textos(str), e a coluna_idade irá receber números inteiros(int), o que resulta em:

        modelo_treeView = Gtk.ListStore(str, int)

  • Criando as Colunas:


    Agora passamos para a criação das colunas:

        coluna_nome = Gtk.TreeViewColumn('Nome', Gtk.CellRendererText(), text = 0)
        coluna_idade = Gtk.TreeViewColumn('Idade', Gtk.CellRendererText(), text = 1)

    Não tenho muito o que explicar sobre esse assunto, ainda não aprendi o suficiente para isso, como disse, vou compartilhar o que aprendi, o resto deixo para quem já aprendeu :P
    O que sei é que o 'text' lá no final tem que seguir uma ordem crescente que inicia no 0(zero) e soma um a cada coluna, quem souber mais fique a vontade para comentar e nos ensinar. E o Gtk.CellRendererText() é usado quando se insere textos, números ou qualquer coisa digitável, quando se quer inserir imagens nas colunas usa-se Gtk.CellRendererPixbuf.

  • Adicionando as colunas na Tree View:


    A inserção das colunas deve obedecer a sequencia dos tipos de dados do modelo, no nosso código o primeiro tipo dado no modelo é str,  logo a primeira coluna a ser adicionada é a que recebe dados de textos, ou seja, coluna_nome.
    Para adicionar as colunas na Tree View usamos 'nossa_treeView.append_column(nossa_coluna)', o que no nosso código resulta em:
*Note que adicionamos uma coluna por vez.

    treeView.append_column(coluna_nome) – coluna que recebe str
    treeView.append_column(coluna_idade) – coluna que recebe int

  • Inserindo Dados nas Colunas:


    Agora vamos inserir dados nas colunas da Tree View, sempre lembrando que na verdade inserimos dados no modelo usado na Tree View, e não diretamente na Tree View.
    Usei duas maneiras como exemplo, uma usando o comando 'for' para inserir dados a partir de uma lista, e outra inserindo dados diretamente nas colunas.
    A inserção de dados segue a sequencia em que foram inseridas as colunas na Tree View.

    Usando o 'for' para adicionar dados a partir de uma lista:

        lista_nomes = [['Marcio', 30], ['Isabela', 20], ['Jurandir', 50]]
        for nomes in lista_nomes:
            modelo_treeView.append(nomes)

    Inserindo dados diretamente nas colunas:

        modelo_treeView.append(['Jassira', 99])
        modelo_treeView.append(['Ziraldo', 120])

    Um detalhe importante: 
    Não se pode inserir dados em uma única coluna, quando se insere dados na Tree View é preciso adicionar dados em todas as colunas. Por exemplo, se quisermos deixar a coluna_nome em branco usamos '' pois é uma coluna que deve receber dados str, com isso a coluna recebe uma string vazia, mas ainda assim recebe dados, ou seja, uma string vazia.

         modelo_treeView.append(['', 99])

    Já a coluna_idade não pode ficar em branco pois ela deve receber dados int, o que podemos fazer é colocar um 0 (zero) para indicar a ausência de valor.

        modelo_treeView.append(['Jassira', 0])

    O restante do código já deve ser conhecido de quase todos:

        janela = Gtk.Window(title = 'Janela contendo a TreeView') => Cria a janela
        janela.set_default_size(300, 300) => Define um tamanho para a janela
        janela.connect('delete-event', Gtk.main_quit) => Conecta o sinal de fechamento da janela
        janela.add(treeView) => Adiciona a Tree View na janela
        janela.show_all() => Mostra a Janela

        Janela_com_a_treeView() => Inicia a classe responsável pela janela com a Tree View

       Gtk.main() => Inicia o Loop que é interrompido ao fechar a janela ''janela.connect('delete-event', Gtk.main_quit)''.


    Na próxima postagem irei falar um pouco mais sobre Treeview, com um exemplo um pouco maior. Até a próxima!

segunda-feira, 26 de maio de 2014

O que pretendo...

Criei esse blog com a intenção de compartilhar tudo o que tenho aprendido e o que ainda vou aprender em Python; Não sou Programador, nem sou 'fera' em Python, sou apenas um curioso que gosta de programação como hobby. 
Cem por cento do que aprendi, foi graças ao esforço e dedicação de pessoas que se dispuseram a compartilhar seus conhecimentos em fóruns, blogs, enfim, pela internet a fora(ou seria a dentro?).
Agora, nada mais justo que eu também partilhe o que aprendi, e quem sabe com isso eu possa ajudar outras pessoas a também aprender.
Também quero frisar que não sou experiente em blogs, esse é meu primeiro, então não fiquem zangados ao encontrar erros, ou até mesmo post's sem muito nexo, mal explicados; Nesses casos, ficarei grato em receber dicas e sugestões para corrigir e melhorar.
Na medida que me for possível, irei criando novas postagens, não posso garantir o ritmo das mesmas, pois tenho trabalho, família, um cachorrinho e três gatos  para cuidar.
Inclusive, vou terminando por hoje, pois tenho de voltar ao trabalho. Obrigado pela presença, e até a próxima!