Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 
Índice general » Mundo Perl » Formación » Perl/TK (ToolKit GUI) Uso con MYSQL #1.1 Responder al tema
Nuevo tema


Página 1 de 1  [ 5 mensajes ] 
 
Nota 2009-10-22 10:19 @471

Perlero Nuevo
Registrado: 2009-10-19 08:50 @409
Mensajes: 18
Perl/TK (ToolKit GUI) Uso con MYSQL #1.1
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.


Syntax: [ Download ] [ Hide ]
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.  



Syntax: [ Download ] [ Hide ]
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.  


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

Syntax: [ Download ] [ Hide ]
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);


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


Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. $mw->Button(-text => " SALIR ",
  2.             -command => sub { exit })->pack(-side => 'bottom');
  3.  
  4. $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!

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. $listboxes = [ $mw->Listbox(), $mw->Listbox(), $mw->Listbox( ) ];


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

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. foreach $list (@$listboxes) {
  2.   $list->configure(-yscrollcommand => [ \&scroll_listboxes, $scroll,
  3.                                        $list, $listboxes ],-height=>"5");
  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.

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. $scroll->configure(-command => sub { foreach $list (@$listboxes) {
  2.                                        $list->yview(@_);
  3.                                      }});
  4.  
  5. $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.


Syntax: [ Download ] [ Hide ]
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");


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

Syntax: [ Download ] [ Hide ]
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;


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

Syntax: [ Download ] [ Hide ]
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.  


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

Syntax: [ Download ] [ Hide ]
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:
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!

_________________
Imagen
GUI ADM PERL


Última edición por TKZeXe el 2009-10-23 06:59 @333, editado 2 veces en total

Nota 2009-10-22 16:09 @714
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10268
Re: Perl/TK (ToolKit GUI) Uso con MYSQL #1.1
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


Nota 2009-10-23 07:01 @334

Perlero Nuevo
Registrado: 2009-10-19 08:50 @409
Mensajes: 18
Re: Perl/TK (ToolKit GUI) Uso con MYSQL #1.1
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


Nota 2009-10-23 09:05 @420
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10268
Re: Perl/TK (ToolKit GUI) Uso con MYSQL #1.1
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


Nota 2009-10-23 10:19 @471

Perlero Nuevo
Registrado: 2009-10-19 08:50 @409
Mensajes: 18
Re: Perl/TK (ToolKit GUI) Uso con MYSQL #1.1
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:

Syntax: [ Download ] [ Hide ]
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";


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

Gracias

_________________
Imagen
GUI ADM PERL


Última edición por explorer el 2009-10-23 11:37 @525, editado 1 vez en total
Ortografía


Responder al tema  [ 5 mensajes ] 

Reglas del Foro
No puedes abrir nuevos temas en este Foro
No puedes responder a temas en este Foro
No puedes editar tus mensajes en este Foro
No puedes borrar tus mensajes en este Foro
No puedes enviar adjuntos en este Foro

Publicidad

Socializa

Síguenos por Twitter

Suscríbete GRATUITAMENTE al Boletín de Perl en Español

Saltar a:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traducción al español por Huan Manwë para phpbb-es.com
phpBB SEO