terça-feira, abril 10, 2007

Introdução a PyGTK - parte 1

A um tempo venho mechendo bastante em PyGTK, aprendi muita coisa interessante(ainda falta muuito). Apesar de eu estar usando Glade pra "desenhar" minhas interfaces, vou começar falando de "puro" PyGTK.
Dependendo da distribuição de Linux usada, ela já traz o PyGTK instalado, senão você pode encontrar para Linux/Unix e Windows aqui.

Depois de instalado, vamos verificar se tá tudo bem. No interpretador vamos importá-lo:

>>> import pygtk
>>> pygtk.require('2.0')

Não retornando nenhum erro, tá tudo OK. Já existem versões mais novas que a 2.0, a mais atual estável e a 2.10.x.
E importante saber que vamos trabalhar com widgets, um widget é qualquer parte da interface. Um botão é um widget, assim como a janela, uma entrada de texto, etc.
Agora vamos ao código.

class primeiraJanela:
   def __init__(self):
     self.janela = gtk.Window()
     self.janela.set_title('Minha janela')
     self.botao = gtk.Button('Ola Mundo')
     self.janela.add(self.botao)

Aqui nós acabamos de criar uma janela e um botao, colocamos um título na janela e adicionamos o botao nessa janela.
Quando um botão é clicado, o widget emite um sinal. Nós devemos capturar esse sinal e associá-lo a um handler, que nada mais é do que uma função no código, que fará alguma coisa quando receber tal sinal.

     self.botao.connect('clicked', self.botaoClicado)
    self.janela.connect('destroy', self.fecharTudo)

Ao botão, relacionamos o sinal 'clicked' com a função botaoClicado que vamos fazer em seguida. O sinal 'destroy' associando a janela, é quando clicamos no X pra fechá-la. Existem vários tipos de sinais, mas esses servirão por enquanto.
É necessário mostrar cada widget cridado, com o método show(). Basicamente é isso. Criamos o widget, associamos seu sinal com uma função e mostramos ele.
O correto é chamar o método show() tanto para a janela quanto para o botão. Mas tem o show_all(), que mostrará os dois.

     self.janela.show_all()

Pronto. Esse foi o __init__ de nossa classe principal. Agora vamos fazer nossa funções de callbacks, que no caso são somente duas: uma para o botão e uma para fechar a janela

   def botaoClicado(self, button):
     print 'Ola mundo do PyGTK!!' 
  def fecharTudo(self, window):
    self.janela.hide()
    gtk.main_quit()

Quando o botão for clicado, aparecerá no terminal a mensagem: Ola mundo do PyGTK!!
O botao de fechar a janela for clicado, a jenela será escondida, e o programa será fechado.
Aqui termina a nossa classe principal. Agora so falta chamá-la

if __name__ == '__main__':
  primeiraJanela()
  gtk.main()

O código completo está abaixo. Existe muita documentação sobre PyGTK, inclusive no site da nossa comunidade[1]
E claro a documentação oficial[2]


import pygtk
import gtk

class primeiraJanela:
  def __init__(self):
     self.janela = gtk.Window()
     self.janela.set_title('Minha janela')
     self.botao = gtk.Button('Ola mundo!')

     self.janela.add(self.botao)

     self.janela.connect('destroy', self.fechar)
     self.botao.connect('clicked', self.botaoClicado)

     self.janela.show_all()

  def botaoClicado(self, button):
     print 'Ola mundo do PyGTK!'

  def fechar(self, window):
     self.janela.hide()
     gtk.main_quit()

if __name__ == '__main__':
  primeiraJanela()
  gtk.main()

[1]Python Brasil
[2]Tutorial PyGTK

4 comentários:

Gabriel Falcão disse...

O legal é que quando conectamos um sinal à uma função manipuladora(handler) a instância do widget é enviada como argumento.
Sendo assim
em:

def fecharTudo(self, window):
self.janela.hide()

pode-se fazer:
def fecharTudo(self, widget):
widget.hide()

alguns widgets especiais enviam mais de um argumento, isso permite que o trabalho de manipulá-lo seja mais fácil!

legal né!?
Eu até costumo fazer:
def fecharTudo(*args):
args[0].janela.hide()
ou
args[1].hide()
print args
pra ver quais os objetos que foram passados como argumento.

Abraço!

Unknown disse...

Boa tarde ...
meu nome é Filipe e gostei muito da explicação.
Gostaria de poder ler um tutorial sobre como trabalhar com varias janelas, isso é muito util em aplicacoes comerciais e não tenho achado muita materia sobre o assunto ...

Fica aqui minha gratidão pelo artigo ... valeu mesmo ...

filipefws@gmail.com

Unknown disse...

Já usei o Glade e não gostei de depender dele.

Então estou desenvolvendo uma IDE
"GenTKode"

Analisem e comentem.
http://w14.easy-share.com/1699583622.html

klebermoura.pa@gmail.com

Helder disse...

Ola

Muito bom...

Agora estou tentando fazer de forma que na primeira janela tenho um botao e quando clicaado abra uma nova janela.

COmo fazer isto e como controlar de forma que se ja abriu a segunda janela nao abranovamente mas apenas "set_foucs" nela sem criar nova janela toda vez que o usuario clica no botão ?

Grato,