Bienvenidos a otro ejemplo de
Perl/TK, esta vez conectándonos a una base de datos MySQL.
Y mostrando datos con interfaz gráfica (GUI).
El ejemplo es bien trivial pero nos ayudará para empezar a jugar con los datos y manipularlos
Con Perl/TK.
Como siempre, mostraremos el código entero y después explicaremos línea por línea.
Se debe manejar al menos el mínimo conocimiento de Perl CLI para absorber de mejor forma los conocimientos.
Using perl Syntax Highlighting
#!/usr/bin/perl
use Tk;
use DBI;
use strict;
my $host = "localhost";
my $database="test";
my $user = "root";
my $pw = "28alonso28";
my $oConexInf="DBI:mysql:database=$database;$host:3306";
my $connect=DBI->connect($oConexInf,$user,$pw);
my $mw = MainWindow->new();
$mw->title("Scrollbar/Con BDD");
$mw->geometry('410x100');
$mw->resizable(0, 0);
$mw->Button(-text => " SALIR ",
-command => sub { exit })->pack(-side => 'bottom');
my $scroll = $mw->Scrollbar( );
# ARRAY con 3 listbox
my $listboxes = [ $mw->Listbox(), $mw->Listbox(), $mw->Listbox( ) ];
# Configura cada cuadro de lista
foreach my $list (@$listboxes) {
$list->configure(-yscrollcommand => [ \&scroll_listboxes, $scroll,
$list, $listboxes ],-height=>"5",-selectforeground=>"red",-selectmode=>"multiple");
}
# Configure the Scrollbar to scroll each Listbox
$scroll->configure(-command => sub { foreach my $list (@$listboxes) {
$list->yview(@_);
}});
# usamos pack() en la barra de desplazamiento y la listbox
$scroll->pack(-side => 'left', -fill => 'y');
#ponemos los nombres de las columnas
@$listboxes[0]->pack(-side => 'left');
@$listboxes[0]->insert('0',"ID");
@$listboxes[1]->pack(-side => 'left');
@$listboxes[1]->insert('0',"PRECIO");
@$listboxes[2]->pack(-side => 'left');
@$listboxes[2]->insert('0',"NOMBRE");
#
my $query="SELECT ID,Precio,Nombre from Productos ";
my $sth = $connect->prepare($query);
$sth->execute();
while(my @fila=$sth->fetchrow_array())
{
@$listboxes[0]->pack(-side => 'left');
@$listboxes[0]->insert('end',$fila[0]);
@$listboxes[1]->pack(-side => 'left');
@$listboxes[1]->insert('end',$fila[1]);
@$listboxes[2]->pack(-side => 'left');
@$listboxes[2]->insert('end',$fila[2]);
}
MainLoop;
# Este método se llama cuando un cuadro de lista se desplaza con el teclado
# Hace que la barra de desplazamiento de reflejar el cambio, y se desplaza las otras listas
sub scroll_listboxes {
my ($sb, $scrolled, $lbs, @args) = @_;
$sb->set(@args); # Llama a la barra de desplazamiento
my ($top, $bottom) = $scrolled->yview( );
foreach my $list (@$lbs) {
$list->yviewMoveto($top); # ajusta cada lb
}
}
Using perl Syntax Highlighting
#!/usr/bin/perl
use Tk;
use DBI;
use strict;
my $host = "localhost";
my $database="test";
my $user = "root";
my $pw = "28alonso28";
my $oConexInf="DBI:mysql:database=$database;$host:3306";
my $connect=DBI->connect($oConexInf,$user,$pw);
* En estas líneas llamamos a la librería Tk a la de Mysql (La pueden instalar de CPAN o PPM, super sencillo) y posteriormente nos conectamos a la base de datos.
Using perl Syntax Highlighting
$mw = MainWindow->new();
$mw->title("Scrollbar/Con BDD By TKZeXe");
$mw->geometry('410x100');
$mw->resizable(0, 0);
*
¡Ojo!, aquí, aparte de crear una instancia de la ventana (la cual contendrá nuestros
widgets) ¡¡estamos configurándola!! Le damos una altura y ancho, también le decimos que ni el eje "x" ni "y" serán
resizables (ponemos valor 1 si queremos activarlo).
Using perl Syntax Highlighting
$mw->Button(-text => " SALIR ",
-command => sub { exit })->pack(-side => 'bottom');
$scroll = $mw->Scrollbar( );
* Aquí creamos un
widget botón alineado hacia la parte inferior y al hacerle clic ejecuta la función exit() (salir del programa). ¡También creamos una nueva instancia del
widget Scrollbar!
Using perl Syntax Highlighting
$listboxes = [ $mw->Listbox(), $mw->Listbox(), $mw->Listbox( ) ];
* Almacenamos en un
array la cantidad de instancias de Listbox que necesitemos (en este caso solo 3)
Using perl Syntax Highlighting
foreach $list (@$listboxes) {
$list->configure(-yscrollcommand => [ \&scroll_listboxes, $scroll,
$list, $listboxes ],-height=>"5");
}
* Recorremos las
ListBox anteriormente creadas y vamos configurándolas, con
-yscrollcommand le asignamos una barra de desplazamiento vertical y ejecutamos la subrutina
&scroll_listboxesque le pasamos distintos parámetros; su funcionamiento lo vemos más abajo.
Using perl Syntax Highlighting
$scroll->configure(-command => sub { foreach $list (@$listboxes) {
$list->yview(@_);
}});
$scroll->pack(-side => 'left', -fill => 'y');
* Configuramos el
scrollbar; con el valor que le da
pack() al elemento
scrollbar alineamos a la izquierda y le decimos que rellene todo el espacio que hay verticalmente.
Using perl Syntax Highlighting
@$listboxes[0]->pack(-side => 'left');
@$listboxes[0]->insert('0',"ID");
@$listboxes[1]->pack(-side => 'left');
@$listboxes[1]->insert('0',"PRECIO");
@$listboxes[2]->pack(-side => 'left');
@$listboxes[2]->insert('0',"NOMBRE");
* En estas líneas creamos los "títulos" de una forma trivial pero legible.
Alineamos a la izquierda todos los
listbox (parten del elemento 0 los
array en Perl) y con la función insert() le paso por parámetro el
index del elemento "0", o sea, el primer elemento contendrá los títulos.
Using perl Syntax Highlighting
$query="SELECT ID,Precio,Nombre from Productos ";
my $sth = $connect->prepare($query);
$sth->execute();
while(my @fila=$sth->fetchrow_array())
{
@$listboxes[0]->pack(-side => 'left');
@$listboxes[0]->insert('end',$fila[0]);
@$listboxes[1]->pack(-side => 'left');
@$listboxes[1]->insert('end',$fila[1]);
@$listboxes[2]->pack(-side => 'left');
@$listboxes[2]->insert('end',$fila[2]);
}
MainLoop;
* Aquí simplemente hacemos una
query a la base de datos y la recorremos con fetchrow() (en PHP, mysql_fetch_array()) al elemento "
end" que significa después del último elemento, o sea, al final de la
listbox agregamos los DATOS. Y finalmente
MainLoop; que le decimos que hasta aquí llega la
GUI.
Using perl Syntax Highlighting
sub scroll_listboxes {
my ($sb, $scrolled, $lbs, @args) = @_;
$sb->set(@args); # Llama a la barra de desplazamiento
my ($top, $bottom) = $scrolled->yview( );
foreach $list (@$lbs) {
$list->yviewMoveto($top); # ajusta cada lb
}
}
* Esta subrutina hace el trabajo "
difícil": recibe como parámetro las instancias
$scroll,$list,$listboxes respectivamente; con set() establece los valores "first" y "last" que es donde se ubicará la barra de desplazamiento, se le pasan argumentos denominados "anónimos", así se accede a los valores de forma rápida (
no se preocupen en entenderlo todo todavía), después con yview() recibimos los valores que tiene actualmente la barra para "pegarlos" en todas las
listbox existentes; para hacer eso las recorremos con un foreach() y con
yviewMoveto() le pasamos el parámetro $top que es el valor $top de la barra de desplazamiento, en este caso no usamos $bottom. Y así dejamos a las
listbox iguales basadas en la barra de desplazamiento.
Algunas opciones de configuraciones de lo escrito:ScrollBar:-activebackground => color
Establece el color de la barra.
-activerelief => 'flat' | 'groove' | 'raised' | 'ridge' | 'sunken'
Tipo de dibujo de los elementos activos.
-background => color
es obvio, ¿no? ^_^
-borderwidth => amount
-command => callback
Uso idéntico de botón y otros.
-cursor => cursorname
Establece nombre del cursor (
Mouse).
-orient => "horizontal" | "vertical"
-relief => 'flat'|'groove'|'raised'|'ridge'|'sunken'|'solid'
Bordes.
-takefocus => 0 | 1 | undef
Si es que queremos que tome como foco el teclado la barra de desplazamiento.
-width => amount
ListBox:-background => color
-borderwidth => amount
-cursor => cursorname
Igual que
scrollbar.
-font => fontname
Tipo de letra (
Arial,
Comic, etc.)
-height => amount
Altura.
-relief => 'flat'|'groove'|'raised'|'ridge'|'sunken'|'solid'
Tipo de borde.
-selectbackground => color
Establece el color de fondo a ítemes seleccionados.
-selectborderwidth => amount
Establece el tamaño del borde a ítemes seleccionados.
-selectforeground => color
Establece el color del texto a ítemes seleccionados.
-selectmode => "single" | "browse" | "multiple" | "extended"
Elementos que se pueden seleccionar a la vez.
-takefocus => 0 | 1 | undef
Igual que
scrollbar.
-width => amount
El ancho de caracteres si es menos o igual de 0, es tan ancho como caracteres tenga.
-xscrollcommand => callback
-yscrollcommand => callback
Código SQL para la base de datos test (crear la base de datos test; luego ejecutar este código):Using sql Syntax Highlighting
CREATE TABLE `productos` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`Precio` double(9,3) DEFAULT NULL,
`Nombre` varchar(50) DEFAULT NULL,
PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=11 ;
--
-- Volcar la base de datos para la tabla `productos`
--
INSERT INTO `productos` VALUES (1, 12.500, 'Crema');
INSERT INTO `productos` VALUES (2, 9.600, 'Shampoo');
INSERT INTO `productos` VALUES (3, 150.000, 'Maquina Afeitar');
INSERT INTO `productos` VALUES (4, 110.900, 'Secador Pelo');
INSERT INTO `productos` VALUES (5, 9.900, 'Balsamo');
INSERT INTO `productos` VALUES (6, 35.700, 'Peine');
INSERT INTO `productos` VALUES (7, 51.000, 'Alisador');
INSERT INTO `productos` VALUES (8, 3.500, 'Jabon 250ml');
INSERT INTO `productos` VALUES (9, 4.700, 'Jabon 500ml');
INSERT INTO `productos` VALUES (10, 99.900, 'Depiladora');
Así quedaría el programita:
A lo mejor no es el ejemplo más práctico para una empresa, pero así vamos superándonos, haré otro ejemplo
flexgrid de vb6 o algo por el estilo, el típico para mostrar datos, así vamos profesionalizando estas prácticas.
OJO Cualquier duda, postean; no dudaré en responder y estoy al pendiente.
¡
salu2!