• Publicidad

Perl/TK (ToolKit GUI) Uso con MYSQL #1.1

Aprende Perl

Perl/TK (ToolKit GUI) Uso con MYSQL #1.1

Notapor TKZeXe » 2009-10-22 10:19 @471

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.


Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use Tk;
  3. use DBI;
  4. use strict;
  5.  
  6. my $host = "localhost";
  7. my $database="test";
  8. my $user = "root";
  9. my $pw = "28alonso28";
  10. my $oConexInf="DBI:mysql:database=$database;$host:3306";
  11. my $connect=DBI->connect($oConexInf,$user,$pw);
  12.  
  13.  
  14. my $mw = MainWindow->new();
  15. $mw->title("Scrollbar/Con BDD");
  16. $mw->geometry('410x100');
  17. $mw->resizable(0, 0);
  18.  
  19. $mw->Button(-text => " SALIR ",
  20.             -command => sub { exit })->pack(-side => 'bottom');
  21.  
  22. my $scroll = $mw->Scrollbar( );
  23. # ARRAY con 3 listbox
  24. my $listboxes = [ $mw->Listbox(), $mw->Listbox(), $mw->Listbox( ) ];
  25.  
  26. # Configura cada cuadro de lista
  27. foreach my $list (@$listboxes) {
  28.   $list->configure(-yscrollcommand => [ \&scroll_listboxes, $scroll,
  29.                                        $list, $listboxes ],-height=>"5",-selectforeground=>"red",-selectmode=>"multiple");
  30. }
  31.  
  32. # Configure the Scrollbar to scroll each Listbox
  33. $scroll->configure(-command => sub { foreach my $list (@$listboxes) {
  34.                                        $list->yview(@_);
  35.                                      }});
  36.  
  37. # usamos pack() en la barra de desplazamiento y la listbox
  38. $scroll->pack(-side => 'left', -fill => 'y');
  39.  
  40. #ponemos los nombres de las columnas
  41.   @$listboxes[0]->pack(-side => 'left');
  42.   @$listboxes[0]->insert('0',"ID");
  43.   @$listboxes[1]->pack(-side => 'left');
  44.   @$listboxes[1]->insert('0',"PRECIO");
  45.   @$listboxes[2]->pack(-side => 'left');
  46.   @$listboxes[2]->insert('0',"NOMBRE");
  47. #
  48.  
  49. my $query="SELECT ID,Precio,Nombre from Productos ";
  50.  
  51. my $sth = $connect->prepare($query);
  52. $sth->execute();
  53. while(my @fila=$sth->fetchrow_array())
  54. {
  55.  
  56.   @$listboxes[0]->pack(-side => 'left');
  57.   @$listboxes[0]->insert('end',$fila[0]);
  58.   @$listboxes[1]->pack(-side => 'left');
  59.   @$listboxes[1]->insert('end',$fila[1]);
  60.   @$listboxes[2]->pack(-side => 'left');
  61.   @$listboxes[2]->insert('end',$fila[2]);
  62.  
  63. }
  64.  
  65. MainLoop;
  66.  
  67. # Este método se llama cuando un cuadro de lista se desplaza con el teclado
  68. # Hace que la barra de desplazamiento de reflejar el cambio, y se desplaza las otras listas
  69. sub scroll_listboxes {
  70.   my ($sb, $scrolled, $lbs, @args) = @_;
  71.   $sb->set(@args); # Llama a la barra de desplazamiento
  72.   my ($top, $bottom) = $scrolled->yview( );
  73.   foreach my $list (@$lbs) {
  74.     $list->yviewMoveto($top); # ajusta cada lb
  75.   }
  76. }
  77.  
  78.  
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4



Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use Tk;
  3. use DBI;
  4. use strict;
  5.  
  6. my $host = "localhost";
  7. my $database="test";
  8. my $user = "root";
  9. my $pw = "28alonso28";
  10. my $oConexInf="DBI:mysql:database=$database;$host:3306";
  11. my $connect=DBI->connect($oConexInf,$user,$pw);
  12.  
  13.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


* 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.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $mw = MainWindow->new();
  2. $mw->title("Scrollbar/Con BDD      By TKZeXe");
  3. $mw->geometry('410x100');
  4. $mw->resizable(0, 0);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


* ¡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).


Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $mw->Button(-text => " SALIR ",
  2.             -command => sub { exit })->pack(-side => 'bottom');
  3.  
  4. $scroll = $mw->Scrollbar( );
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


* 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!

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $listboxes = [ $mw->Listbox(), $mw->Listbox(), $mw->Listbox( ) ];
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


* Almacenamos en un array la cantidad de instancias de Listbox que necesitemos (en este caso solo 3)

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. foreach $list (@$listboxes) {
  2.   $list->configure(-yscrollcommand => [ \&scroll_listboxes, $scroll,
  3.                                        $list, $listboxes ],-height=>"5");
  4. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


* Recorremos las ListBox anteriormente creadas y vamos configurándolas, con -yscrollcommand
le asignamos una barra de desplazamiento vertical y ejecutamos la subrutina &scroll_listboxes
que le pasamos distintos parámetros; su funcionamiento lo vemos más abajo.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $scroll->configure(-command => sub { foreach $list (@$listboxes) {
  2.                                        $list->yview(@_);
  3.                                      }});
  4.  
  5. $scroll->pack(-side => 'left', -fill => 'y');
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


* 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.


Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.   @$listboxes[0]->pack(-side => 'left');
  2.   @$listboxes[0]->insert('0',"ID");
  3.   @$listboxes[1]->pack(-side => 'left');
  4.   @$listboxes[1]->insert('0',"PRECIO");
  5.   @$listboxes[2]->pack(-side => 'left');
  6.   @$listboxes[2]->insert('0',"NOMBRE");
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


* 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.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $query="SELECT ID,Precio,Nombre from Productos ";
  2.  
  3. my $sth = $connect->prepare($query);
  4. $sth->execute();
  5. while(my @fila=$sth->fetchrow_array())
  6. {
  7.  
  8.   @$listboxes[0]->pack(-side => 'left');
  9.   @$listboxes[0]->insert('end',$fila[0]);
  10.   @$listboxes[1]->pack(-side => 'left');
  11.   @$listboxes[1]->insert('end',$fila[1]);
  12.   @$listboxes[2]->pack(-side => 'left');
  13.   @$listboxes[2]->insert('end',$fila[2]);
  14.  
  15. }
  16.  
  17. MainLoop;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


* 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.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub scroll_listboxes {
  2.   my ($sb, $scrolled, $lbs, @args) = @_;
  3.   $sb->set(@args); # Llama a la barra de desplazamiento
  4.   my ($top, $bottom) = $scrolled->yview( );
  5.   foreach $list (@$lbs) {
  6.     $list->yviewMoveto($top); # ajusta cada lb
  7.   }
  8. }
  9.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


* 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):

Sintáxis: [ Descargar ] [ Ocultar ]
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');
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4




Así quedaría el programita:
Imagen


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!
Última edición por TKZeXe el 2009-10-23 06:59 @333, editado 2 veces en total
Imagen
GUI ADM PERL
TKZeXe
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2009-10-19 08:50 @409

Publicidad

Re: Perl/TK (ToolKit GUI) Uso con MYSQL #1.1

Notapor explorer » 2009-10-22 16:09 @714

No es nada recomendable usar el módulo Mysql... es mucho mejor usar el módulo DBI con el controlador DBD::mysql. :?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Perl/TK (ToolKit GUI) Uso con MYSQL #1.1

Notapor TKZeXe » 2009-10-23 07:01 @334

Listo, Explorer, modificado ^_^.

Una cosilla, ¿nos podrías darnos detalles de por qué no es recomendable?

Para que quede claro.

¡Saludos!
Imagen
GUI ADM PERL
TKZeXe
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2009-10-19 08:50 @409

Re: Perl/TK (ToolKit GUI) Uso con MYSQL #1.1

Notapor explorer » 2009-10-23 09:05 @420

Pues porque DBI es una capa de abstracción de acceso a base de datos. Eso quiere decir que si lo usamos y en el futuro, en lugar de usar MySQL, el usuario desea usar otra base de datos, el único cambio que tiene que hacer en el programa es modificar el DSN de conexión.

En MySQL también lo recomiendan.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Perl/TK (ToolKit GUI) Uso con MYSQL #1.1

Notapor TKZeXe » 2009-10-23 10:19 @471

Muchas gracias, explorer.

Con esto nos queda claro ;)

Yo en lo personal uso DBI para Oracle y MySQL.

Me asalta una duda: para conectarme a un MSSQL lo estoy haciendo de esta forma:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $DSN="driver={SQL Server};Server=$MSQL_HOST;database=$MSQL_DATAB;uid=sa;pwd=sa;";
my $dbh=DBI->connect("dbi:ODBC:$DSN") or die "$DBI::errstr";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿¿Estará bien, o habrá una forma mejor??

Gracias
Última edición por explorer el 2009-10-23 11:37 @525, editado 1 vez en total
Razón: Ortografía
Imagen
GUI ADM PERL
TKZeXe
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2009-10-19 08:50 @409


Volver a Formación

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados