360 pág.

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"/>