A maior rede de estudos do Brasil

Grátis
360 pág.
python para desenvolvedores completo

Pré-visualização | Página 26 de 47

é usado pelo GNOME62 (ambiente desktop Open Source) e por 
diversos aplicativos, como os portes do Mozilla Firefox e do BrOffice.org para 
60 A página internet do projeto reside em: http://www.gtk.org/. e os binários para Windows 
estão disponíveis em: http://gladewin32.sourceforge.net/. A versão para desenvolvedores 
instala o Glade.
61 Endereço oficial do projeto: http://www.gimp.org/.
62 Documentação e fontes em: http://www.gnome.org/.
214 Interface Gráfica
sistemas UNIX. O GTK+ pode ser usado no Python através do pacote 
PyGTK63. Os portes das bibliotecas para Windows podem ser encontrados 
em:
▪ PyGTK: http://ftp.gnome.org/pub/gnome/binaries/win32/pygtk/
▪ PyGObject: http://ftp.gnome.org/pub/gnome/binaries/win32/pygobject/
▪ PyCairo: http://ftp.gnome.org/pub/gnome/binaries/win32/pycairo/
Embora seja possível criar interfaces inteiramente usando código, é mais 
produtivo construir a interface em um software apropriado. O Glade gera 
arquivos XML com extensão “.glade”, que podem ser lidos por programas 
que usam GTK+, automatizando o processo de criar interfaces gráficas.
Roteiro básico para construir uma interface:
No Glade:
▪ Crie uma janela usando algum dos modelos disponíveis em “Níveis 
Superiores”.
▪ Crie containers para armazenar os controles.
▪ Crie os controles.
▪ Crie os manipuladores para os sinais necessários.
▪ Salve o arquivo com a extensão “.glade”.
No Python:
▪ Importe os pacotes necessários.
▪ Use o GTK para interpretar o arquivo XML do Glade.
▪ Crie rotinas para serem usadas como funções callback.
▪ Associe as rotinas com os manipuladores correspondes que foram 
criados no Glade, através do método signal_autoconnect().
▪ Ative o laço para processar eventos com gtk.main().
Exemplo (relógio):
No Glade:
▪ Clique em “janela” em “Níveis Superiores”.
▪ Nas propriedades da janela:
• Mude “Nome” para “main” em “Geral”.
63 A página na internet do PyGTK é http://www.pygtk.org/.
Interface Gráfica 215
• Mude “Redimensionável” para “Sim”.
• Mude “Posição da janela” para “Centralizar”.
• Mude “Visível” para “Sim” em “Comum”.
• Mude o manipulador para “on_main_destroy” do sinal “destroy” 
de “GtkObject” em “Sinais”.
▪ Clique em “Caixa vertical” em “Containers”, depois clique dentro da 
janela e escolha o número de itens igual a 3.
▪ Clique em “Barra de menu” em “Containers”, depois clique dentro do 
espaço vazio superior e delete os itens “Editar” e “Ver”.
▪ Clique em “Barra de status” em “Controle e Exibição” e depois clique 
dentro do espaço vazio inferior.
▪ Mude o nome da barra de status para “sts_data” em “Geral”.
▪ Clique em “Rótulo” em “Controle e Exibição” e depois clique dentro 
do espaço vazio central.
▪ Nas propriedades do rótulo, mude “Nome” para “lbl_hora” e “Rótulo” 
para vazio em “Geral”, “Solicitação de largura” para “300” e 
“Solicitação de altura” para “150” em “Comum”.
▪ No “Inspetor” (lista em forma de árvore com todos itens), delete:
• “imagemenuitem1”.
• “imagemenuitem2”.
• “imagemenuitem3”.
• “imagemenuitem4”.
• “separatormenuitem1”.
▪ No “Inspetor”:
• localize “imagemenuitem5” e mude o manipulador em “Sinais” do 
sinal “activate” para “on_imagemenuitem5_activate” de 
“GtkMenuItem”.
• localize “imagemenuitem10” e mude o manipulador em “Sinais” do 
sinal “activate” para “on_imagemenuitem10_activate” de 
“GtkMenuItem”.
▪ Salve o arquivo como “relogio.glade”.
Janela principal do relógio:
216 Interface Gráfica
Código em Python:
# -*- coding: latin1 -*-
"""
Um relógio com GTK.
"""
import datetime
# GTK e outros módulos associados
import gtk
import gtk.glade
import gobject
import pango
class Relogio(object):
 """
 Implementa a janela principal do programa.
 """
 def __init__(self):
 """
 Inicializa a classe.
 """
 # Carrega a interface
 self.tree = gtk.glade.XML('relogio.glade', 'main')
 # Liga os eventos
 callbacks = {
 'on_main_destroy': self.on_main_destroy,
 'on_imagemenuitem5_activate': self.on_main_destroy,
 'on_imagemenuitem10_activate': self.on_imagemenuitem10_activate
Interface Gráfica 217
 }
 self.tree.signal_autoconnect(callbacks)
 # Coloca um título na janela
 self.tree.get_widget('main').set_title('Relógio')
 # O rótulo que reberá a hora
 self.hora = self.tree.get_widget('lbl_hora')
 # A barra de status que reberá a data
 self.data = self.tree.get_widget('sts_data')
 print dir(self.data)
 # Muda a fonte do rótulo
 self.hora.modify_font(pango.FontDescription('verdana 28'))
 # Um temporizador para manter a hora atualizada
 self.timer = gobject.timeout_add(1000, self.on_timer)
 def on_imagemenuitem10_activate(self, widget):
 """
 Cria a janela de "Sobre".
 """
 # Caixa de dialogo
 dialog = gtk.MessageDialog(parent=self.tree.get_widget('main'),
 flags=gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
 type=gtk.MESSAGE_OTHER, buttons=gtk.BUTTONS_OK,
 message_format='Primeiro exemplo usando GTK.')
 dialog.set_title('Sobre')
 dialog.set_position(gtk.WIN_POS_CENTER_ALWAYS)
 # Exibe a caixa
 dialog.run()
 dialog.destroy()
 return
 def on_timer(self):
 """
 Rotina para o temporizador.
 """
 # Pega a hora do sistema
 hora = datetime.datetime.now().time().isoformat().split('.')[0]
218 Interface Gráfica
 # Muda o texto do rótulo
 self.hora.set_text(hora)
 # Pega a data do sistema em formato ISO
 data = datetime.datetime.now().date().isoformat()
 data = 'Data: ' + '/'.join(data.split('-')[::-1])
 # Coloca a data na barra de status
 self.data.push(0, data)
 # Verdadeiro faz com que o temporizador rode de novo
 return True
 def on_main_destroy(self, widget):
 """
 Termina o programa.
 """
 raise SystemExit
if __name__ == "__main__":
 # Inicia a GUI
 relogio = Relogio()
 gtk.main()
Arquivo “relogio.glade”:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
<!--Generated with glade3 3.4.3 on Sat May 03 14:06:18 2008 -->
<glade-interface>
 <widget class="GtkWindow" id="main">
 <property name="visible">True</property>
 <property name="resizable">False</property>
 <property name="window_position">GTK_WIN_POS_CENTER</property>
 <signal name="destroy" handler="on_main_destroy"/>
 <child>
 <widget class="GtkVBox" id="vbox1">
 <property name="visible">True</property>
 <child>
 <widget class="GtkMenuBar" id="menubar1">
 <property name="visible">True</property>
 <child>
Interface Gráfica 219
 <widget class="GtkMenuItem" id="menuitem1">
 <property name="visible">True</property>
 <property name="label" translatable="yes">_Arquivo</property>
 <property name="use_underline">True</property>
 <child>
 <widget class="GtkMenu" id="menu1">
 <property name="visible">True</property>
 <child>
 <widget class="GtkImageMenuItem" id="imagemenuitem5">
 <property name="visible">True</property>
 <property name="label" translatable="yes">gtk-
quit</property>
 <property name="use_underline">True</property>
 <property name="use_stock">True</property>
 <signal name="activate" 
handler="on_imagemenuitem5_activate"/>