Conheça o Adianti Framework para PHP:

  • Desenvolvimento com componentes;
  • Formulários e datagrids.
  • Versão Web e Desktop (Gtk);
  • Multiplataforma;
  • Desenhe as interfaces;
  • IDE própria (Adianti Studio).
Ver detalhes...

PHP-GTK Programação de sinais

Para prosseguir com o download do artigo, é necessário realizar login utilizando o Facebook ou Google. Este procedimento é totalmente seguro e nossa aplicação é certificada por ambos os serviços. Após a autenticação, você será direcionado de volta à nossa página para continuar o download.

Login com Facebook Login com Google

Resumo

ou "Interagindo com o Usuário" Introdução No artigo anterior estudamos as diversas formas de se construir uma interface em PHP-GTK. Neste terceiro artigo, estudaremos como programar a aplicação para que esta responda à interação do usuário através da programação de sinais. Widgets Como vimos no artigo anterior, a biblioteca GTK é formada por um conjunto de classes organizadas hierarquicamente. A maioria destas classes implementam widgets. "Widgets" é o termo utilizado para descrever um elemento gráfico de uma interface. Um widget pode ser um botão, um radiobutton, um checkbutton, uma imagem, uma lista ou mesmo uma janela. Exemplos de widgets Containers Alguns widgets podem conter outros em seu interior, como por exemplo a janela, o frame, o notebook, um botão ou uma janela de rolagem. Nestes casos, eles também são chamados de containers (contêiners). Um contêiner é utilizado para organizar a interface e distribuir seu conteúdo. Nem todo contêiner é visível, existem contêiners como as caixas vertical (GtkVBox) e horizontal (GtkHBox), além da tabela (GtkTable) que não são perceptíveis ao usuário, sendo que somente seu conteúdo é visível. A seguir temos alguns exemplos de contêiners. Exemplos de Contêiners Signals e Callbacks Após criar uma interface, é necessário programar a interação do usuário com a aplicação. Diferentemente da web, onde o fluxo de execução da aplicação é baseado na requisição de páginas, em aplicações standalone como o Gtk, a programação é baseada em sinais e eventos. Um sinal é uma mensagem enviada por um widget sempre que o usuário interage com ele. Diferentes widgets emitem diferentes sinais sob diferentes circunstâncias. Pode parecer complexo, mas na verdade é bastante simples. Um botão, por exemplo, emite o sinal "clicked" quando ele é clicado, "pressed" quando é pressionado e "released" quando é solto. Uma janela emite o sinal "destroy" quando é fechada, uma opção do menu emite o sinal "activate" quando é selecionada e uma lista emite o sinal "row-activated" quando o usuário clica duas vezes sobre um de seus itens. Como o programador descobre estas palavras mágicas ? Na documentação de cada widget. Se você acessar a página www.php-gtk.com.br/gtkbutton, verá a documentação de um botão e lá constará uma relação dos seus sinais e sob quais circunstâncias eles são acionados. Sempre que um sinal é emitido pelo Gtk cabe ao programador definir o que será feito, criando uma função para responder à emissão deste sinal. As funções que são criadas para reagir à sinais são chamadas de "callbacks". Uma callback pode ser uma função ou um método de um objeto como veremos nos exemplos a seguir. Programação Estruturada No programa a seguir, demonstraremos a utilização de sinais e callbacks através de programação estruturada. Neste exemplo, iremos construir uma janela que irá pedir ao usuário o peso e a sua altura, e quando este clicar no botão "calcula", o programa irá exibir o índice de massa corpórea no console. Note que os comandos "echo" e "print", que na web exibem o resultado em uma página HTML, no Gtk exibem os resultados na linha de comando na qual o programa foi executado. O Gtk possui classes para exibição de diálogos com o usuário que são mais apropriadas para exibir mensagens. Veja que neste exemplo estamos criando uma janela e alguns objetos ($peso, $altura, $botao) e adicionando-os à janela por meio de uma caixa vertical (GtkVBox). A parte mais importante deste exemplo é o momento que conectamos o sinal "clicked" do botão, à função calcula_imc(). Com isto, estamos ordenando ao Gtk executar tal função sempre que o botão for clicado. Como os objetos criados ($peso, $altura) não existem dentro da função calcula_imc(), tivemos de utilizar o recurso variáveis globais, para tornar as variáveis visíveis em todo programa. Este recurso deve ser evitado ao máximo e foi utilizado aqui somente por motivos didáticos. O cálculo do índice é realizado dividindo o peso pelo quadrado da altura. Para obter os valores digitados em um campo de digitação do tipo GtkEntry (input), utilizamos o método get_text(). tela de cálculo do imc get_text(); $valor_altura = $altura->get_text(); echo ($valor_peso/($valor_altura*$valor_altura)) . "\n"; } // cria interface $janela = new GtkWindow; $peso = new GtkEntry; $altura = new GtkEntry; $botao = new GtkButton('calcula'); // conecta o sinal 'clicked' à função 'calcula_imc' $botao->connect_simple('clicked', 'calcula_imc'); $vbox = new GtkVBox; $vbox->add(new GtkLabel('Peso:')); $vbox->add($peso); $vbox->add(new GtkLabel('Altura:')); $vbox->add($altura); $vbox->add($botao); $janela->add($vbox); // exibe a janela $janela->show_all(); Gtk::Main(); ?> Programação Orientada a Objetos No exemplo anterior vimos como construir uma janela utilizando a programação estruturada. No próximo exemplo, iremos escrever um programa muito parecido, mas desta vez utilizando a orientação a objetos. A utilização da orientação a objetos nos dá maior flexibilidade e modularidade, permitindo reutilizar muito mais facilmente estruturas lógicas já existentes. O próprio Gtk, permite que criemos novas classes baseadas nas suas. No exemplo a seguir, estamos criando uma janela para cálculo da média entre dois números. Veja que esta janela, chamada "CalculaMedia" é filha de GtkWindow, uma classe nativa do Gtk que implementa uma janela. Assim, por meio da utilização de herança, reaproveitamos toda a estrutura já existente de uma janela e a especializamos, adicionando alguns comportamentos específicos. Neste exemplo, estamos criando dois objetos ($valor1 e $valor2), além de um botão para calcular o resultado ($botao) e um rótulo de texto ($result) que será utilizado para exibir o resultado do cálculo. Quando o usuário clicar no botão calcula, o método calcula_media() será executado e o resultado da média entre os dois valores será calculado e exibido no lugar do rótulo de texto $result. Nesta classe, optamos por definir todo visual da janela no seu método construtor (construct). Neste caso não precisamos mais utilizar variáveis globais. No lugar delas, optamos por declarar os objetos que precisaríamos acessar, como atributos desta classe (private $valor1, por exemplo). Desta forma, eles são acessíveis ao longo de toda classe. Note que neste programa, a forma de conectar o sinal "clicked" do botão à uma função se alterou. No lugar de especificarmos somente o nome de uma função no método connect_simple(), passamos como parâmeto um vetor formado por duas posições: a primeira indica um objeto e a segunda o nome de um método a ser executado. Neste programa, no lugar de exibir o resultado do cálculo no console do sistema, estamos jogando-o de volta à tela, por meio de um rótulo de texto localizado abaixo do botão calcula ($result). tela do calcula média valor1 = new GtkEntry; $this->valor2 = new GtkEntry; $this->result = new GtkLabel('resultado'); $botao = new GtkButton('calcula'); // conecta o sinal 'clicked' ao método 'calcula_media' $botao->connect_simple('clicked', array($this, 'calcula_media')); // coloca os campos em uma caixa vertical $vbox = new GtkVBox; $vbox->add($this->valor1); $vbox->add($this->valor2); $vbox->add($botao); $vbox->add($this->result); parent::add($vbox); // exibe a janela parent::show_all(); } // calcula a média entre dois números function calcula_media() { $media = ($this->valor1->get_text() + $this->valor2->get_text()) / 2; $this->result->set_text($media); } } new CalculaMedia; Gtk::Main(); ?> Conclusão Neste artigo vimos como responder à interações do usuário com a interface. No próximo e último artigo da série, iremos estudar como se dá a integração com bancos de dados utilizando o Sqlite, que é um banco de dados standalone e de fácil distribuição. Referências e links sugeridos [PHP-GTK Brasil] - http://www.php-gtk.com.br [Livro PHP-GTK] - http://www.php-gtk.com.br/book [Site do Autor] - http://www.pablo.blog.br Sobre o Autor Pablo Dall'Oglio é bacharel em Informática pela UNISINOS. Autor dos projetos em software livre Agata Report e Tulip, além dos livros "PHP Programando com Orientação a Objetos" e "PHP-GTK Criando Aplicações Gráficas com PHP", pela editora Novatec. Mantenedor da comunidade brasileira de PHP-GTK. Atualmente, é diretor de tecnologia e proprietário da Adianti Solutions (www.adianti.com.br). Pode ser contatado pelo e-mail pablo@php.net.