Sección GUIUso del módulo PERL/TK Básico (Instalación y Ejemplo).Perl/Tk es un módulo de Perl para la creación de elementos gráficos.
Con pocos esfuerzo los programas GUI pueden trabajar a través de Windows y en plataformas Unix.
Los elementos se basan en componentes(Ventanas,Frames) y widgets(TexBox,ListBox,Label,etc).
Esto nace ya que la mayoría del código Perl que utilizamos se basa en la escritura en interfaces a través de código, con esto el usuario final podrá interactuar con Perl a través de botones, textos y ventanas armoniosas.
En Windows con Activestate viene por defecto instalado, sino solo tienen que buscar en el repositorio (
ppm o
cpan) por "TK".
* para ver si lo tenemos instalado solo basta poner en MSDOS Windows:
perl -e "use Tk"P.D.: si nos arroja una excepción debemos instalar el módulo.
* para ver nuestra versión de Tk, pon el siguiente comando:
perl -MTk -e "print $Tk::VERSION"P.D.: lo ideal es tener la versión 800.022 en adelante.

Bueno, mostraremos el mítico "Hola Mundo" e iremos explicando línea por línea.
Using perl Syntax Highlighting
#!/usr/bin/perl
use Tk;
my $mw = MainWindow->new;
$mw->title("Hello World");
$mw->Button(-text => "Salir del Programa!", -command => sub { exit })->pack;
MainLoop;
Using perl Syntax Highlighting
* Con esto llamamos a la librería TK; no hay mucho que explicar.
Using perl Syntax Highlighting
my $mw = MainWindow->new;
* En esta línea creamos la ventana (o una instancia de ella). Tendrá la misma decoración que el resto de las ventanas.
Using perl Syntax Highlighting
$mw->title("Hello World");
* Aquí le pasamos a la función title() del objeto MainWindow como parámetro el título de la ventana.
Using perl Syntax Highlighting
$mw->Button(-text => "Salir del Programa!", -command => sub { exit })->pack;
* en esta línea agregamos al objeto $mw el
widget button y su respectiva configuración.
Como vemos, esta configuración del botón se pasa como argumento y al final se ejecuta el comando
pack(); para poder ver el botón y cualquier
widget este comando es sustancial.
En este ejemplo vemos dos atributos configurados:
-tex : este es el texto que tiene el botón (
value en HTML)
-command: esto se ejecuta cuando damos clic encima del botón (
onClick en HTML).
Más adelante veremos los tipos de eventos.
Si se fijan, es un tipo de
array asociativo el que se pasa por parámetro el tipo de configuración y el valor de ésta.
También podemos pasar subrutinas como en el caso de
-command que le pasamos
*inlinela subrutina exit() como parámetro.
Hasta aquí va todo bien, pero hay algo curioso. Si se fijan al final de la declaración del botón
se le ejecuta otra función
IMPORTANTE llamada pack(). Con ésta mostramos nuestro
widget (botón,
texbox, etc) y manipulamos con algunas opciones que le podemos pasar por parámetro, la relación entre ventanas, el espaciado entre
widget, las posiciones y valores en la ventana y otras varias opciones; en este caso se dejó por
default sin parámetros.
También podríamos
instanciarla de la siguiente forma:
my $btn=$mw->Button(-text => "Salir del Programa!", -command => sub { exit });
$btn->pack();Al igual que pack() existen otras formas de manipular los
widgets como "grid" o "form"
en el orden que ejecutemos pack() irán apareciendo los
widgets.
Using perl Syntax Highlighting
ATENCIÓN: esta es nuestra última línea de código para declarar la GUI.
Después de ésta se ejecutará código perl como subrutinas si las quisieras declarar. Todo lo que se ejecute después de esta línea no se tomará en cuenta para la interfaz.
Y así funciona nuestro primer programa Perl/Tk:

Si has usado anteriormente VB6, Delphi for PHP, o ASP.NET, encontrarás que las propiedades de los objetos y éstos mismos son similares.
Si dominas perl Tk podrás crear interfaces para el usuario poderosas y fáciles de manipular.
Bueno, vamos a algo un poquito más elaborado:
Using perl Syntax Highlighting
#!/usr/bin/perl
use Tk;
require Tk::BrowseEntry;
my $oDespedida="Adios Mundo!";
my $mw = MainWindow->new;
$mw->title("Titulo Ventana");
$mw->Label(-text => "Como vemos, amigos de Perl en español, esta ventana se ve más\n
agradable que la anterior ya que hemos utilizado configuraciones de pack().\n
Para darle posiciones en la ventana y ¡ordenar los widgets!",
-background => "LIGHTBLUE"
)->pack( -fill => 'x');
$mw->Button(-text => $oDespedida,
-command =>\&salir)->pack(-side => 'bottom',
-expand => 1,
-fill => 'x');
$lb = $mw->Scrolled("Listbox", -scrollbars => "e",
-selectmode => "single")->pack( );
$lb->insert('end', qw/red yellow green blue grey magenta gold brown darkblue darkred black/);
$lb->bind('<Button-1>',\&change );
MainLoop;
#aquí abajo declaramos subrutinas si es necesario
sub change{ $lb->configure(-background =>
$lb->get($lb->curselection( )) );
}
sub salir{
print "Has salido del programa, saludos";
exit;
}
Bueno, analicemos lo que no hemos aprendido:
Using perl Syntax Highlighting
* Aquí llamamos o incluimos la subclase BrowseEntry que nos dará todo el poder para manejar listas o listas múltiples y sus respectivas configuraciones.
Using perl Syntax Highlighting
$mw->Label(-text => "Como vemos amigos de Perl en español esta ventana se ve más\n
agradable que la anterior ya que hemos utilizado configuraciones de pack().\n
Para darle posiciones en la ventana y ¡ordenar los widgets!.",
-background => "LIGHTBLUE"
)->pack( -fill => 'x');
* En esta línea creamos un
widget del tipo Label con el texto que se mostrará y un fondo azul claro. Con esto:
-fill => 'x', le decimos que se extienda por todo el eje
x dentro del
frame o ventana que esté embebido.
Using perl Syntax Highlighting
$mw->Button(-text => $oDespedida,
-command =>\&salir)->pack(-side => 'bottom',
-expand => 1,
-fill => 'x');
* En esta línea:
-command =>\&salir llamamos a la función salir que declaramos más abajo;
con
-expand => 1 le decimos que rellene el espacio que falte para completar el espacio de la ventana o
frame.
Using perl Syntax Highlighting
$lb = $mw->Scrolled("Listbox", -scrollbars => "e",
-selectmode => "single")->pack( );
* Aquí es donde utilizamos "Tk::BrowseEntry"; creamos un
listbox con un
scrollbar incluido para que cuando nos pasemos del límite lo genere automáticamente; con
-selectmode => "single" le decimos que solo se pueda seleccionar de a un elemento.
Using perl Syntax Highlighting
$lb->insert('end', qw/red yellow green blue grey magenta gold brown darkblue darkred black/);
* Aquí es donde insertamos los elementos a la
listbox. "end" significa justo después del último elemento.
Using perl Syntax Highlighting
$lb->bind('<Button-1>',\&change );
* Esta parte es importante ya que con "bind" le incluimos un evento al
widget seleccionado;
en este caso es el evento del botón 1 del
mouse (clic izquierdo); al pulsarlo se llama a la función change().
Using perl Syntax Highlighting
sub change{ $lb->configure(-background =>
$lb->get($lb->curselection( )) );
}
* Esta función configura o reconfigura el
listbox cambiándole el fondo de color por
el que esté seleccionado actualmente (tienen que ser colores válidos, inglés,
rgb).
¡OJO! ¡¡Uso de pack() y otros!!Hablaremos de los
ADMINISTRADORES de la geometría.
Cada uno de estos muestran los
widget de distinta forma o con distintas reglas.
Cambien tienen sus propios métodos para configurar las posiciones de los
widgets.
Ya hemos usado uno de ellos,
pack(), pero también existen otros.
Definámoslos:
*pack: La regla de este método nos dice que entre los
widget no pueden sobreponerse unos con otros parcial o totalmente, o sea, nos dice que sería como un rompecabezas.
Sus opciones (Básicas) :-side => 'left' | 'right' | 'top' | 'bottom Coloca el
widget en contra de la parte específica de la ventana o el marco.
-fill => 'none' | 'x' | 'y'| 'both' Rellenamos el
widget en la dirección especificada.
-expand => 1 | 0 Rellena el espacio restante en el
frame o ventana así se acomoda.
-anchor => 'n' | 'ne' | 'e' | 'se' | 's' | 'sw' | 'w' | 'nw' | 'center' Ancla el
widget dentro del rectángulo de asignación.
-after => $otherwidget Muestra el
widget después del
widget pasado como variable.
-before => $otherwidget Muestra el
widget antes del
widget pasado como variable.
*grid: Se divide la ventana en un
grid compuesto por columnas y filas (0,0).
Sus opciones (Básicas) :"-"Un carácter especial que se utiliza en la lista de
widget del
grid. Aumenta
ColumnSpan del
widget antes en la lista de
widgets.
"x" Un carácter especial que se utiliza en la lista de
widget del
grid. Deja un espacio en blanco en la cuadrícula.
"^" Un carácter especial que se utiliza en la lista de
widget de la red. Aumenta
rowspan del
widget en el
grid directamente sobre ella.
-column => n Establece la columna (mayor que 0).
-row => m Establece la fila (mayor que 0).
-columnspan => n Establece el número de columnas a abarcar (
colspan de HTML).
-rowspan => m Establece el número de filas a abarcar (
rowspan de HTML).
*place: Está permitido la superposicion de
widgets, y se basa en coordenadas
relativas del eje X e Y.
Sus opciones (Básicas) :-anchor => 'n' | 'ne' | 'e' | 'se' | 's' | 'sw' | 'w' | 'nw' | 'center'La misma que pack().
-bordermode => 'inside' | 'outside' | 'ignore'Determina si la parte frontera está incluida en la coordenada.
-height => amountDefine la altura absoluta del
widget.
-width => amountDefine el ancho absoluto del
widget.
-x => xIndica la distancia que se pondrá el
widget en el eje x.
-y => yIndica la distancia que se pondrá el
widget en el eje y.
Por ahora andamos bien.
FELICIDADES, faltarían un par de ejemplos más y ya podríamos combinar lo aprendido con una base de datos MSSQL, MYSQL, Oracle u otras.
Les recomiendo un libro de referencia como
Perl/Tk de O'Reilly (
quick o
full) para que vayan viendo las demás opciones.
En todo caso, cualquier duda, me consultan.
Estaré haciendo el tutorial para crear algo con una base de datos Mysql y más ejemplos.