Guia Rapido de PyGTK

From OLPC
Jump to navigation Jump to search

Introdução

Este é um tutorial baseado principalmente no PyGTK 2.0 Tutorial [1]. Nossa intenção aqui é mostrar o funcionamento da linguagem de programação Python, cujo link para a pagina oficial do projeto encontra-se aqui [2], utilizando para isto o PyGTK. A motivação para criação do mesmo derivou do fato desta linguagem de programação ter sido eleita como a oficial do projeto One Laptop Per Child.

Iniciando o Python

Para iniciarmos uma janela no Sugar (sistema operacional do XO) necessitamos criar uma atividade. Um modo fácil de contornar isto antes de aprendermos a criar a atividade é iniciando um novo X no terminal. Para isto abra o Console (Alt + =) e clique em Terminal:


Sugar terminal.png


Fig. 1.1. - Terminal do XO


(...)$ su
(...)# startx -- :1


No novo X que surgirá, com o mouse posicionado em cima da janela digite:

geany


Geany.png


Figura 1.2. - Janela do Geany

E vamos iniciar nosso primeiro programa (o número das linhas irá surgir automáticamente):

   1   #!/usr/bin/env python
   2
   3   # example base.py
   4
   5   import pygtk
   6   pygtk.require('2.0')
   7   import gtk
   8
   9   class Base:
  10       def __init__(self):
  11           self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
  12           self.window.show()
  13
  14       def main(self):
  15           gtk.main()
  16
  17   print __name__
  18   if __name__ == "__main__":
  19       base = Base()
  20       base.main()

Após digitar este código salve-o (clicando no Salvar) com o nome base.py Agora execute o programa. (No botão Executar)

Uma figura similar com essa irá surgir:


Base.png
Fig 1.3. - Base.py

Olá a Todos!

Agora vamos ao nosso primeiro programa com um widget (um botão). Antes de passar ao código em si um pouco de teoria. No meio do código abaixo vocês irão perceber a presença de muito texto, explicando o que acontece no programa. Esta é uma pratica muito comum e muitas vezes necessarias, já que muitas vezes fazemos programas que serão posteriormente utilizado por outros e sem comentários fica díficil de outra pessoa dar continuidade no trabalho iniciado por você. Neste caso os comentários tem o intuito de explicar cada passo do programa. Em Python toda linha de comentário é precedida por '#' e tudo que seguir será ignorado pelo interpretador.

Programa olatodos.py

 1 #!/usr/bin/env python
 2
 3 import pygtk
 4 import gtk
 5
 6 #Aqui iniciamos nossa classe
 7 class HelloWorld:
 8
 9 # Esta eh uma função de retorno. Neste exemplo os argumentos serao ignorados neste exemplo.
10   def hello(self, widget, data=None):
11      print "Ola a Todos"
12
13 # Retornando False (falso) nesta funcao o GTK ira emitir o sinal de "destroy". Se voce retornar True
14 # (verdadeiro),significa que voce nao quer que a janela seja fechada, o que eh muito util quando se quer fazer 
15 # surgir uma janela (pop up) para perguntar se o usuario deseja mesmo fechar a janela.
16   def delete_event(self, widget, event, data=None):
17       print "Delecao de evento ocorrida"
18       return False
19 # Troque o False (Falso) acima por True (verdadeiro) e veja o que acontece.
20
21 # Outro retorno
22   def destroy(self, widget, data=None):
23       gtk.main_quit()
24 
25   def __init__(self):
26
27      # Cria uma nova janela (window)
28      self.window = gtk.Window()
29      
30     # Quando a janela da o sinal "delete_event" (em geral dado pelo gerenciador de janelas, normalmente pela 
31     # opcao "close" (fechar), ou na barra de titulo.)
32      self.window.connect("delete_event", self.delete_event)
33  
34     # Aqui conectamos o evento "destroy" ao direcionador de sinal
35     # Este evento ocorre quando chamamos gtk_widget_destroy() na janela, ou se retornamos FALSE na funcao de 
36     retorno "delete_event"
37     self.window.connect("destroy", self.destroy)
38
39     # Escolhe o tamanho do lado da janela
40     self.window.set_border_width(10)
41
42     # Cria um novo botao com o rotulo "Clique Aqui".
43     self.button = gtk.Button("Clique Aqui")
44
45     # Quando o botao recebe o sinal "clicked" (clicado), ele chama a funcao hello(), mandando None (Nada) como 
46     # argumento. A funcao hello() esta definida acima.
47     self.button.connect("clicked", self.hello, None)
48
49     # Isto causara a destruicao da janela chamando gtk_widget_destroy(window) quando "clicked"(clicado).
50     # Novamente o sinal poderia vir daqui ou do gerenciador de janelas
51     self.button.connect_object("clicked", gtk.Widget.destroy, self.window)
52     
53     # Este comando empacota o botao dentro da janela
54     self.window.add(self.button)
55
56     # O passo final para mostrar o mais novo widget criado
57     self.button.show()
58
59     # e a janela
60     self.window.show()
61
62  def main(self):
63     # Todas as aplicacoes PyGTK tem que ter um gtk.main(). O controle acaba aqui e
64     # aguarda um evento ocorrer (como um clique de mouse ou um pressionar de tecla)
65     gtk.main()
66
67 # Se o programa rodar diretamente ou for passado como um argumento para o interpretador de python
68 # ele criara uma HelloWord e o mostrara.
69 if __name__ == "__main__":
70   hello = HelloWorld()
71   hello.main()
Olatodos.png


Fig 3.1. - Figura gerada a partir do olatodos.py

Olhando mais a fundo o Olá a Todos!

Vamos agora dar uma olhada mais profunda no olatodos.py e discutir um pouco sobre o conteúdo do programa.

A primeira linha do programa:


1 #!/usr/bin/env python


Esta linha é obrigatória em todo programa escrito em python e diz ao interpretador que ele deve transformar o arquivo em executável.

Em seguida temos:

3 import pygtk
4 import gtk

Estas linhas de comando importam o pygtk e o gtk, respectivamente. GTK é um conjunto de métodos desenvolvido para a linguagem de programação C/C++ utilizado para gerar as janelas e os botões. O PyGTK é quem fornece a interface entre o Python e o GTK, nos permitindo assim utilizar métodos feitos em uma linguagem em outra.

A palavra reservada class é utilizada antes de iniciarmos uma classe e é seguida pelo seu nome e ":"

7 class HelloWorld:

As funções de retorno sempre são definidas pelo nome e seguidas pelos argumentos que elas utilizam.

10 def hello(self, widget, data=None):