Uso 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;
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
Using perl Syntax Highlighting
* Con esto llamamos a la librería TK; no hay mucho que explicar.
Using perl Syntax Highlighting
* 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
* 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;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
* 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 *inline
la 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
MainLoop;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
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;
- }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
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');
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');
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
* 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');
-command =>\&salir)->pack(-side => 'bottom',
-expand => 1,
-fill => 'x');
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
* 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( );
-selectmode => "single")->pack( );
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
* 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/);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
* 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 );
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
* 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( )) );
}
$lb->get($lb->curselection( )) );
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
* 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 => amount
Define la altura absoluta del widget.
-width => amount
Define el ancho absoluto del widget.
-x => x
Indica la distancia que se pondrá el widget en el eje x.
-y => y
Indica 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.