Você está na página 1de 3

Sinais em interfaces grcas com PHP-GTK

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

Figura 1 Elementos de uma janela.

Linux Magazine #39 | Fevereiro de 2008

75

PROGRAMAO | PHP-GTK, parte 3

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.

nal clicked quando clicado, pressed quando pressionado e released

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

Figura 2 Contineres so elementos especiais


que podem conter outros elementos em seu interior.

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().

Programao orientada a objetos


No exemplo 1, vimos como construir uma janela utilizando a programao estruturada. No prximo exemplo, vamos escrever um programa muito parecido, mas dessa vez utilizando a orientao a objetos. A utilizao da orientao a objetos nos d maior exibilidade e modularidade, permitindo reutilizar muito mais facilmente estruturas lgicas j existentes. O prprio GTK permite que criemos novas classes baseadas nas suas. No exemplo 2, criamos uma janela para clculo da mdia entre dois nmeros. Veja que essa janela (gura 4), chamada CalculaMedia, lha de GtkWindow, uma classe nativa do GTK que implementa uma janela.

76

http://www.linuxmagazine.com.br

PHP-GTK, parte 3 | PROGRAMAO

Figura 3 Janela do programa que


exibe o ndice de massa corprea.

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-

Figura 4 Janela do programa que


calcula a mdia entre dois nmeros.

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).

Linux Magazine #39 | Fevereiro de 2008

77