Explicação
Existe um sinal insert-text que é disparado assim que um texto é inserido no GtkEntry. Em seu callback é possível buscar o texto digitado e enviar o cancelamento do sinal com stop_emission(). É conectado o GtkEntry ao sinal insert-text. Em seu callback busca-se o caractere digitado. Verifica se o char é um numero. Caso não for, cancela a inserção com o método stop_emission();
Solução
Conectar o GtkEntry ao evento insert-text;
Fazer a verificação se o texto digitado é numérico;
Caso não for parar o sinal com o método stop_emission() do GtkObject.
Exemplo
widgets['txtTeste'] = new GtkEntry();
$this->widgets['txtTeste']->set_size_request(100, 25);
$fixed->put($this->widgets['txtTeste'], 8, 8);
// Conecta o entry ao evento
$this->widgets['txtTeste']->connect("insert-text", array($this, "txtText_onInsert"));
// Cria a janela
$this->widgets['frmTeste'] = new GtkWindow();
$this->widgets['frmTeste']->set_size_request(116, 66);
$this->widgets['frmTeste']->set_resizable(FALSE);
$this->widgets['frmTeste']->set_title("Teste");
$this->widgets['frmTeste']->add($fixed);
$this->widgets['frmTeste']->set_position(GTK::WIN_POS_CENTER);
$this->widgets['frmTeste']->show_all();
// Conecta o destroy
$this->widgets['frmTeste']->connect_simple(
"destroy",
array("Gtk", "main_quit")
);
}
// Método onInsert do txtEntry
public function txtText_onInsert($widget, $text, $len, $position)
{
$char = substr($text, 0, $len);
if((!preg_match("/[0-9]/", $char)) And ($char != ","))
{
$widget->emit_stop_by_name("insert-text");
return TRUE;
}
return FALSE;
}
}
// Inicia a aplicação
$teste = new Teste();
gtk::main();
Referências
http://gtk.php.net/manual/en/gobject.method.stop_emission.php
http://gtk.php.net/manual/en/gtk.gtkeditable.signal.insert-text.php