El problema está en que Perl no sabe lo que significa TRUE y FALSE. No son símbolos que sean exportados por el módulo Gtk2.
Si miras el manual que hay en
Introduction to GUI Programming with Gtk2-Perl verás que usan esas constantes, pero después de definirlas al principio:
Using perl Syntax Highlighting
use constant TRUE
=> 1;
use constant FALSE
=> 0;Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Con esto, ya salen ajustados los contenidos dentro de la tabla. Lo mismo pasa con la palabra 'false'.
Perl, por defecto, cuando encuentra una palabra que no sabe lo que es y está seguro de que no es una función, la convierte a una palabra suelta (una cadena de caracteres). Así que, en tu programa, estás poniendo un valor verdadero (la cadena de caracteres 'false') en un sitio donde realmente querías poner un valor falso (que, tendría que ser una cadena vacía '' o un 0). Así que te toca cambiar todos los 'false' del programa por la nueva constante 'FALSE'.
Para evitar estos errores, nadie mejor que el propio Perl para que nos avise.
Ponemos 'use warnings;' al principio del programa y empiezan a salir errores y avisos como este:
Unquoted string "false" may clash with future reserved word at ./code_19824_2.pl line 9.Perl te está avisando de que ha encontrado una cadena de caracteres, que es "false", y que, de la manera que la has escrito (sin entrecomillar), sospecha que puede interferir con futuras palabras reservadas del Perl. Te deja seguir, pero te lo advierte. Para nosotros, significa que hemos colocado un literal donde realmente queríamos colocar una constante.
Además, Perl nos avisa de otro error:
Unquoted string "gtk" may clash with future reserved word at ./code_19824_2.pl line 43.¡Vaya! Perl tampoco sabe lo que es "gtk".
El método pack_start() va agregando componentes desde el comienzo del contenedor. Tiene 4 argumentos, que son: el objeto a empaquetar, una bandera que indica si debe tomar espacio suficiente para expandirse, una bandera para indicar si el espacio extra debe ser tomado por el propio objeto o por espacio vacío, y un valor del extra de píxeles que deben rodear al objeto con respecto a sus vecinos.
Veo también que a la hora de crear los HBox, pones valores como 3 y 2, en lugares donde Gtk2 espera un valor booleano. Así que lo que realmente estás pasando es un valor verdadero. Y es precisamente aquí donde estás definiendo que el espacio ocupado por los objetos sea homogéneo, cuando realmente no queremos eso.
El programa quedaría así:
Using perl Syntax Highlighting
#!/usr/bin/perl
use warnings;
use Gtk2 '-init';
use constant TRUE => 1;
use constant FALSE => 0;
my $window = Gtk2::Window->new('toplevel');
$window->set_border_width(10);
$window->signal_connect(destroy =>sub{ Gtk2->main_quit });
$lb1 = Gtk2::Label->new('Numero 1:');
$lb2 = Gtk2::Label->new('Numero 2:');
$lb3 = Gtk2::Label->new('Opcion:');
$lb4 = Gtk2::Label->new('Resultado:');
$text1 = Gtk2::Entry->new;
$text2 = Gtk2::Entry->new;
$text3 = Gtk2::Entry->new;
$boton = Gtk2::Button->new('Calcular');
$vertical = Gtk2::HBox->new(FALSE,3);
$horizontal = Gtk2::HBox->new(FALSE,3);
#$radiobutton1 = Gtk2::RadioButton->new_with_label(undef, '+');
#$grupo = $radiobutton1->get_group;
#$radiobutton2 = Gtk2::RadioButton->new_with_label($grupo, '-');
#$radiobutton3 = Gtk2::RadioButton->new_with_label($grupo, '*');
#$radiobutton4 = Gtk2::RadioButton->new_with_label($grupo, '/');
$radiobutton1 = Gtk2::RadioButton->new_with_label(undef, '+');
$radiobutton2 = Gtk2::RadioButton->new_with_label($radiobutton1, '-');
$radiobutton3 = Gtk2::RadioButton->new_with_label($radiobutton2, '*');
$radiobutton4 = Gtk2::RadioButton->new_with_label($radiobutton3, '/');
$vertical->pack_start($radiobutton1,FALSE,FALSE,0);
$vertical->pack_start($radiobutton2,FALSE,FALSE,0);
$vertical->pack_start($radiobutton3,FALSE,FALSE,0);
$vertical->pack_start($radiobutton4,FALSE,FALSE,0);
$horizontal->pack_start($text3,FALSE,FALSE, 0);
$horizontal->pack_start($boton, TRUE, TRUE, 5);
$tabla=Gtk2::Table->new(4,2,FALSE);
$tabla->attach_defaults($lb1,0,1,0,1);
$tabla->attach_defaults($text1,1,2,0,1);
$tabla->attach_defaults($lb2,0,1,1,2);
$tabla->attach_defaults($text2,1,2,1,2);
$tabla->attach_defaults($lb3,0,1,2,3);
$tabla->attach_defaults($vertical,1,2,2,3);
$tabla->attach_defaults($lb4,0,1,3,4);
$tabla->attach_defaults($horizontal,1,2,3,4);
$window->add($tabla);
$window->show_all;
Gtk2->main;
Coloreado en 0.003 segundos, usando
GeSHi 1.0.8.4
Fíjate también que he colocado una versión alternativa de creación del grupo de botones radio. Tanto la versión que está comentada como la que no, funcionan de la misma manera. Fíjate que el primer botón lo he marcado con un 'undef'.
Todo esto lo he sacado de los manuales de ayuda de Gtk2 en
http://gtk2-perl.sourceforge.net/doc/pod/