Académique Documents
Professionnel Documents
Culture Documents
Programao de sinais
Para conectar a interface grca de um programa ao restante do cdigo, preciso usar sinais. por Pablo DallOglio
Carsten Mller - www.sxc.hu
PROGRAMAO
o artigo anterior, estudamos as diversas formas de se construir uma interface em PHP-GTK. Neste terceiro artigo, veremos como programar aplicativos para que estes respondam interao com o usurio atravs da programao de sinais.
Contineres
Widgets
Como vimos no artigo anterior, a biblioteca GTK formada por um conjunto de classes organizadas hierarquicamente. A maioria dessas classes implementam widgets. Widgets o termo utilizado para descrever um elemento grco de uma interface. Um widget pode ser um boto, um boto de rdio (radiobutton), um boto de marcao (checkbutton), uma imagem, uma lista ou mesmo uma janela (gura 1).
Alguns widgets podem conter outros em seu interior, como por exemplo a janela, o frame, o notebook, um boto ou uma janela de rolagem. Nesses casos, eles tambm so chamados de containers (contineres). Um continer utilizado para organizar a interface e distribuir seu contedo. Nem todo continer visvel, existem contineres como as caixas vertical (GtkVBox) e horizontal (GtkHBox), alm da tabela (GtkTable) que no so perceptveis ao usurio, sendo que somente seu contedo visvel. A gura 2 mostra alguns exemplos de continers.
Web, onde o uxo de execuo do aplicativo baseado na requisio de pginas, em aplicaes standalone como a GTK, a programao baseada em sinais e eventos. Um sinal uma mensagem enviada por um widget sempre que o usurio interage com ele. Diferentes widgets emitem diferentes sinais sob diferentes circunstncias. Pode parecer complexo, mas na verdade bastante simples. Um boto, por exemplo, emite o si-
Sinais e callbacks
Aps criar uma interface, necessrio programar a interao do usurio com a aplicao. Diferentemente da
75
quando solto. Uma janela emite o sinal destroy quando fechada, uma opo do menu emite o sinal activate quando selecionada e uma lista emite o sinal row-activated quando o usurio clica duas vezes sobre um de seus itens. Como o programador descobre essas palavras mgicas? Na documentao de cada widget. Se voc acessar [1], ver a documentao de um boto, e l constar uma relao dos seus sinais e sob quais circunstncias eles so acionados. Sempre que um sinal emitido pela GTK, cabe ao programador denir o que ser feito, criando uma funo para responder emisso deste sinal. As funes que so criadas para reagir a sinais so chamadas de callbacks. Uma callback pode ser uma funo ou um mtodo de um objeto como veremos nos exemplos a seguir.
Programao estruturada
No exemplo 1, demonstramos a utilizao de sinais e callbacks atravs de programao estruturada. Nele, construmos uma janela que pede ao usurio seu peso e altura, e quando este clica no boto calcula, o programa exibe o ndice de massa corprea no console. Note que os comandos echo e print, que na Web exibem o resultado em
uma pgina HTML, na GTK exibem os resultados na linha de comando na qual o programa foi executado. A GTK possui classes para exibio de dilogos com o usurio que so mais apropriadas para exibir mensagens. Veja que no exemplo 1 criamos uma janela (gura 3) e alguns objetos ($peso, $altura, $botao) e os adicionamos janela por meio de uma caixa vertical (GtkVBox). A parte mais importante desse exemplo o momento em que conectamos o sinal clicked do boto funo calcula_ imc(). Com isso, ordenamos ao GTK que execute tal funo sempre que o boto for clicado. Como os objetos criados ($peso, $altura) no existem dentro da funo calcula_imc(), tivemos de utilizar variveis globais para tornar as variveis visveis em todo o programa. Esse recurso deve ser evitado ao mximo, e foi utilizado aqui somente por motivos didticos. O clculo do ndice realizado dividindo-se o peso pelo quadrado da
altura. Para obter os valores digitados em um campo de digitao do tipo GtkEntry (entrada), utilizamos o mtodo get_text().
76
http://www.linuxmagazine.com.br
Assim, por meio da utilizao de herana, reaproveitamos toda a estrutura j existente de uma janela e a especializamos, adicionando alguns comportamentos especcos. No exemplo 2, usamos dois objetos ($valor1 e $valor2), alm de um boto para calcular o resultado ($botao) e um rtulo de texto ($result) que ser utilizado para exibir o resultado do clculo. Quando o usurio clicar no boto
calcula, o mtodo calcula_media() ser executado e o resultado da mdia entre os dois valores ser calculado e exibido no lugar do rtulo de texto $result. Nessa classe, optamos por denir todo o visual da janela no seu mtodo construtor (construct). Nesse caso, no precisamos mais utilizar variveis globais. No lugar delas, optamos por declarar os objetos que precisaramos acessar, como atributos dessa classe (private $valor1, por exemplo). Dessa forma, eles so acessveis ao longo de toda a classe. Note que no programa do exemplo 2, a forma de conectar o sinal clicked do boto a uma funo se alterou. No lugar de especicarmos somente o nome de uma funo no mtodo connect_simple(), passamos como parmeto um vetor formado por duas posies: a primeira indica um objeto e a segunda o nome de um mtodo a ser executado. Nesse programa, no lugar de exibir o resultado do clculo no conso-
le do sistema, estamos jogando-o de volta tela, por meio de um rtulo de texto localizado abaixo do boto calcula ($result).
Neste artigo vimos como responder s interaes do usurio com a interface. No prximo artigo da srie, iremos estudar como se d a integrao com bancos de dados utilizando o Sqlite, que um banco de dados standalone e de fcil distribuio.
Concluso
Mais informaes
[1] Widget de boto: http://www.php-gtk. com.br/gtkbutton [2] PHP-GTK Brasil: http://www.php-gtk.com.br [3] Site do autor: http://www.pablo.blog.br [4] Livro PHP-GTK: http://www.php-gtk. com.br/book
Sobre o autor
Pablo DallOglio (pablo@php.net) graduado em Anlise de Sistemas, autor dos softwares Agata Report e Tulip e tambm de dois livros sobre PHP, alm de manter a comunidade brasileira de PHPGTK. membro da equipe de documentao e criador da comunidade brasileira de PHP-GTK. Atualmente, diretor de tecnologia e proprietrio da Adianti Solutions (www.adianti.com.br).
77