Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 
Índice general » Mundo Perl » Básico » Crear interfaz gráfica con Win32::GUI Responder al tema
Nuevo tema


Página 1 de 5  [ 62 mensajes ]  Ir a página 1, 2, 3, 4, 5  Siguiente
 
Nota 2011-09-15 06:27 @310

Perlero Frecuente
Registrado: 2011-04-04 10:06 @462
Mensajes: 133
Crear interfaz gráfica con Win32::GUI
Hola a todos. He creado mis pantallas con Win32::GUI. He podido ejecutar varios script pulsando los botones correspondientes pero tengo una duda:

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1.  my $main2 = Win32::GUI::Window->new(
  2.             -name => 'Main2',
  3.             -text => 'Principal',
  4.             -pos => [ 350, 200 ],
  5.             -width => 600,
  6.             -height => 600,
  7.             -background => [153,0,0],
  8.     );
  9.     my $EditFont = new Win32::GUI::Font (
  10.             -name => "Fixedsys",
  11.             -size => 12,
  12.         );
  13.      
  14.     $main2->AddTextfield(
  15.         -name      => "Mostar",
  16.         -pos       => [200, 100],
  17.         -size      => [360, 360],
  18.         -multiline => 1,
  19.         -hscroll   => 1,
  20.         -vscroll   => 1,
  21.         -autohscroll => 1,
  22.         -autovscroll => 1,
  23.         -keepselection => 1 ,
  24.         -font => $EditFont,
  25.     );
  26.  



Quiero que en el panel AddTextField se muestren los contactos que tengo en la base de datos y que se puedan seleccionar. Para que me entendáis mejor quiero que se muestren los contactos como cuando abres hotmail y se te muestran los correos que los puedes seleccionar con un clic. Pues me gustaría lo mismo pero solo mostrar el nombre del contacto en cada línea. ¿Alguna opción?


Nota 2011-09-15 06:36 @316
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10249
Re: Crear interfaz gráfica con Win32::GUI
Pues para la parte de acceso a la base de datos, hay bastantes hilos con ejemplos (usa el sistema de búsqueda), y en la página de tutoriales tienes un ejemplo de acceso a una base de datos MySQL.

Y en cuanto AddTextfield(), no tengo idea, pero a lo mejor viene en el manual de Win32::GUI...

_________________
JF^D Perl programming


Nota 2011-09-15 11:05 @503

Perlero Frecuente
Registrado: 2011-04-04 10:06 @462
Mensajes: 133
Re: Crear interfaz gráfica con Win32::GUI
Sí, esas las estuve mirando junto con http://perl-win32-gui.sourceforge.net y bueno, seguiré hasta encontrar cómo ponerlo. Tengo unos pequeños problemas.

1) A la hora de crear la interfaz estoy teniendo que crearlo todo en el mismo script las diferentes pantallas. Intenté hacer una en un script ventana.pl y otra en un script ventan2.pm. Hacia un use en el ventana.pl para poder usar esa pantalla pero, por ejemplo, si en ventana2 tenía un botón con el método $ventana2->Hide();, no funcionaba. Y para poder abrir la ventana2 desde la ventana1 tenía que crearme un método abrir en ventana2 y ejecutarlo desde ventana1. Yo creo que un lio, pero bueno, el problema es que solo me funcionaba con Show(); con Hide() no me funciona.

2) He incorporado en paquete Grupo.pm al script donde estoy diseñando la interfaz. He creado la siguiente subrutina en el script de la interfaz:

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. sub Button13_Click {
  2.         my $texto = $ventanaCG->TextFieldcg1->Text();
  3.         Grupo->new($texto);
  4.        
  5.         $ventanaCG->TextFieldcg2->Text("¡¡¡¡¡Listo!!!!!");  
  6.         return 0;
  7. };



y en Grupo.pm lo recogería:

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. sub new {
  2.     print "Estoy en new\n";
  3.    
  4.     my $grupo = @_;
  5.    
  6.     return $grupo;
  7. }


pero el problema es que cuando ejecuto el script de la interfaz, nada más hacerlo sin pulsar ningún botón me saca por pantalla:

Syntax: [ Download ] [ Hide ]
Using text Syntax Highlighting
0
estoy en new


¿Por qué lo ejecuta sin que yo pulse nada?


Nota 2011-09-15 13:43 @613
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10249
Re: Crear interfaz gráfica con Win32::GUI
Bueno, no está todo el código, pero yo diría que en alguna parte se ha ejecutado un new().

Y creo que

my $grupo = @_;

se debería realmente escribir como

my($grupo) = @_;

o

my $grupo = shift;

(Los paréntesis son significativos.)

_________________
JF^D Perl programming


Nota 2011-09-16 10:49 @492

Perlero Frecuente
Registrado: 2011-04-04 10:06 @462
Mensajes: 133
Re: Crear interfaz gráfica con Win32::GUI
Hola. He mirado y cambiado la subrutina que recibe la información pero sigue imprimiendo el primer print() de "estoy en new" y un 0 por cada print() que imprime el $grupo en crearGrupo.pm.

Código interfaz.

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. #!c:/perl/bin
  2.  
  3. use strict;
  4. use warnings;
  5. use Win32::GUI();
  6. use Spreadsheet::Read;          # Módulo Requerido por Excel.
  7. use autodie;                    # Módulo requerido para finalizar programa en algunos casos.
  8. use Data::Dumper;               # Módulo para realizar algunas acciones.
  9. use ConectarDB;                 # Módulo requerido para conectar a la base de datos.
  10. use DBI;
  11. use crearGrupo;
  12.  
  13. #  Variables a necesitar #
  14.  
  15. my $font = Win32::GUI::Font->new(
  16.         -name => "Arial",
  17.         -size => 14,
  18. );
  19.  
  20. ## Pantalla principal ##
  21.  
  22. my $ventanap = Win32::GUI::DialogBox->new(
  23.         -name => 'Main',
  24.         -text => 'ventana1',
  25.         -pos => [ 350, 200 ],
  26.         -width => 600,
  27.         -height => 600,
  28.         -background => [153,0,0],
  29.         -pushexstyle => 2,
  30. );
  31.  
  32. $ventanap->AddButton(
  33.         -name => "Button1",
  34.         -text => "Abrir",
  35.         -pos  => [ 400, 150 ],
  36.         -size => [ 150, 35 ],
  37.         -onClick => \&buscarArchivo,
  38. );
  39.  
  40. $ventanap->AddButton(
  41.         -name => "Button2",
  42.         -text => "Contactos",
  43.         -pos  => [ 400, 250 ],
  44.         -size => [ 150, 35 ],
  45. );
  46.  
  47. $ventanap->AddLabel(
  48.         -text => " Abrir archivo EXCEL: ",
  49.         -font => $font,
  50.         -pos => [ 70, 160 ],
  51. );
  52.  
  53. $ventanap->AddLabel(
  54.         -text => " Contactos:                ",
  55.         -font => $font,
  56.         -pos => [ 70, 260 ],
  57. );
  58.  
  59.  
  60.  
  61.  
  62. ## Pantalla contactos ##
  63.  
  64. my $ventanaC = Win32::GUI::Window->new(
  65.         -name => 'Main2',
  66.         -text => 'ventana2',
  67.         -pos => [ 350, 200 ],
  68.         -width => 600,
  69.         -height => 600,
  70.         -background => [153,0,0],
  71. );
  72.  
  73. $ventanaC->AddButton(
  74.         -name => "Button5",
  75.         -text => "Volver",
  76.         -pos  => [ 430, 500 ],
  77.         -size => [ 130, 35 ],
  78. );
  79.  
  80. $ventanaC->AddButton(
  81.         -name => "Button6",
  82.         -text => "AñadirContacto",
  83.         -pos => [ 20, 100 ],
  84.         -size => [ 150, 35 ],
  85. );
  86. $ventanaC->AddButton(
  87.         -name => "Button7",
  88.         -text => "AñadirGrupo",
  89.         -pos => [ 20, 150 ],
  90.         -size => [ 150, 35 ],
  91. );
  92. $ventanaC->AddButton(
  93.         -name => "Button8",
  94.         -text => "Eliminar",
  95.         -pos => [ 20, 200 ],
  96.         -size => [ 150, 35 ],
  97. );
  98. $ventanaC->AddButton(
  99.         -name => "Button9",
  100.         -text => "SeleccionarTodo",
  101.         -pos => [ 20, 300 ],
  102.         -size => [ 150, 35 ],
  103. );
  104. $ventanaC->AddButton(
  105.         -name => "Button10",
  106.         -text => "DeseleccionarTodo",
  107.         -pos => [ 20, 350 ],
  108.         -size => [ 150, 35 ],
  109. );
  110. my $EditFont = new Win32::GUI::Font (
  111.         -name => "Fixedsys",
  112.         -size => 12,
  113.     );
  114.  
  115. $ventanaC->AddTextfield(
  116.     -name      => "Mostar",
  117.     -pos       => [200, 50],
  118.     -size      => [360, 400],
  119.     -multiline => 1,
  120.     -hscroll   => 1,
  121.     -vscroll   => 1,
  122.     -autohscroll => 1,
  123.     -autovscroll => 1,
  124.     -keepselection => 1 ,
  125.     -font => $EditFont,
  126. );
  127.  
  128.  
  129.  
  130.  
  131. ## Pantalla Agregar Contacto ##
  132.  
  133. my $ventanaAG = Win32::GUI::DialogBox->new(
  134.         -name => 'Main3',
  135.         -text => 'Agregar Contacto',
  136.         -pos => [ 350, 200 ],
  137.         -width => 450,
  138.         -height => 400,
  139.         -background => [153,0,0],
  140. );
  141. my $labelag = $ventanaAG->AddLabel(
  142.         -text       => "ESCRIBIR LA INFORMACION DEL CONTACTO",
  143.         -font       => $font,
  144.         -left       => 15,
  145.         -top        => 30,
  146.         -foreground => 0x0000FF,
  147. );
  148.  
  149. my $labelag1 = $ventanaAG->AddLabel(
  150.         -text       => "Escribir información del grupo: ",
  151.         -font       => $font,
  152.         -left       => 30,
  153.         -top        => 100,
  154. );
  155. my $labelag2 = $ventanaAG->AddLabel(
  156.         -text       => "Ejemplo: pepe\@hotmail.com",
  157.         -font       => $font,
  158.         -left       => 30,
  159.         -top        => 190,
  160.         -foreground => 0x0000FF,
  161. );
  162. $ventanaAG->AddTextfield(
  163.         -name   => "TextFieldag1",
  164.         -left   => 30,
  165.         -top    => 150,
  166.         -width  => 350,
  167.         -height => 30,
  168.         -readonly => 0,
  169.         -multiline => 1,
  170.  
  171. );
  172. $ventanaAG->AddCombobox(
  173.         -name   => "comboBoxag",
  174.         -left   => 30,
  175.         -top    => 250,
  176.         -width  => 350,
  177.         -height => 30,
  178.         -dropdownlist => 1,
  179.         -vscroll  => 1,
  180.         -onChange => \&loadInfo,
  181.  
  182. );
  183. $ventanaAG->AddButton(
  184.         -name => "Button11",
  185.         -text => "Abrir",
  186.         -left   => 300,
  187.         -top    => 300,
  188.         -width  => 30,
  189.         -height => 20,
  190. );
  191. $ventanaAG->AddButton(
  192.         -name => "Button12",
  193.         -text => "volver",
  194.         -left   => 220,
  195.         -top    => 300,
  196.         -width  => 50,
  197.         -height => 20,
  198. );
  199.  
  200.  
  201. ##  Pantalla Crear grupo ##
  202.  
  203. my $ventanaCG = Win32::GUI::DialogBox->new(
  204.         -name => 'Main4',
  205.         -text => 'Agregar Grupo',
  206.         -pos => [ 350, 200 ],
  207.         -width => 400,
  208.         -height => 400,
  209.         -background => [153,0,0],
  210. );
  211. my $labelcg = $ventanaCG->AddLabel(
  212.         -text       => "ECRIBIR LA INFORMACIÓN DEL GRUPO",
  213.         -font       => $font,
  214.         -left       => 15,
  215.         -top        => 30,
  216.         -foreground => 0x0000FF,
  217. );
  218.  
  219. my $labelcg1 = $ventanaCG->AddLabel(
  220.         -text       => "Escribir información del grupo: ",
  221.         -font       => $font,
  222.         -left       => 30,
  223.         -top        => 100,
  224. );
  225. my $labelcg2 = $ventanaCG->AddLabel(
  226.         -text       => "Ejemplo: Grupo 1",
  227.         -font       => $font,
  228.         -left       => 30,
  229.         -top        => 190,
  230.         -foreground => 0x0000FF,
  231. );
  232.  
  233. $ventanaCG->AddTextfield(
  234.         -name   => "TextFieldcg1",
  235.         -left   => 30,
  236.         -top    => 150,
  237.         -width  => 350,
  238.         -height => 30,
  239.         -readonly => 0,
  240.         -multiline => 1,
  241.  
  242. );
  243. $ventanaCG->AddTextfield(
  244.         -name   => "TextFieldcg2",
  245.         -left   => 30,
  246.         -top    => 250,
  247.         -width  => 350,
  248.         -height => 30,
  249.         -readonly => 0,
  250.         -multiline => 1,
  251.  
  252. );
  253. $ventanaCG->AddButton(
  254.         -name => "Button13",
  255.         -text => "Añadir",
  256.         -left   => 300,
  257.         -top    => 300,
  258.         -width  => 30,
  259.         -height => 20,
  260. );
  261. $ventanaCG->AddButton(
  262.         -name => "Button14",
  263.         -text => "volver",
  264.         -left   => 220,
  265.         -top    => 300,
  266.         -width  => 50,
  267.         -height => 20,
  268. );
  269.  
  270. $ventanap->Show();
  271. Win32::GUI::Dialog();
  272. exit(0);
  273.  
  274. ## Terminar ventana ##
  275. sub ventanap_Terminate {
  276.         return -1;
  277. };
  278. sub ventanaC_Terminate {
  279.         return -1;
  280.  
  281. };
  282. sub ventanaAC_Terminate {
  283.         return -1;
  284.  
  285. };
  286. sub ventanaCG_Terminate {
  287.         return -1;
  288.  
  289. };      
  290.  
  291.  
  292. ## Métodos Botones ##
  293.  
  294.     # Pantalla principal #
  295. sub Button2_Click {
  296.         $ventanaC->Show();
  297.         return 0;
  298. }
  299.  
  300.    
  301.     # Pantalla contactos #
  302.  
  303. sub Button5_Click {
  304.         $ventanaC->Hide();
  305.         return 0;
  306. }
  307. sub Button6_Click {
  308.         $ventanaAG->Show();
  309.         return 0;
  310. }
  311. sub Button7_Click {
  312.         $ventanaCG->Show();
  313.         return 0;
  314. }
  315.  
  316.    # Pantalla Agregar Contacto #
  317.  
  318. sub Button12_Click {
  319.         $ventanaAG->Hide();
  320.         return 0;
  321. }
  322.  
  323.     # Patanlla Agregar grupo #
  324.  
  325. sub Button13_Click {
  326.         my $texto = $ventanaCG->TextFieldcg1->Text();
  327.         print $texto,"\n";
  328.        
  329.         crearGrupo->recibir($texto);
  330.        
  331.         $ventanaCG->TextFieldcg2->Text("Listo!!!!!");  
  332.         return 0;
  333. };
  334. sub Button14_Click {
  335.         $ventanaCG->Hide();
  336.         return 0;
  337. };
  338.  
  339.  
  340. ## Metodos ##
  341.  
  342. sub buscarArchivo {
  343.    
  344.     my $self = shift;
  345.     my $file = Win32::GUI::GetOpenFileName(
  346.                    -owner  => $ventanap,
  347.                    -title  => "Abrir archivo",
  348.                    -filter => [
  349.                        'Excel 2003 (*.xls)' => '*.xls',
  350.                        'Excel 2007 (*.xlsx)' => '*.xlsx',
  351.                     ],
  352.                    );
  353.  
  354.    
  355.     return 0;
  356.        
  357. }


y el código de crearGrupo es:

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. #!c:/perl/bin
  2.  
  3. package crearGrupo;                
  4. use DBI;
  5. use ConectarDBcon;                                      # Módulos requeridos  por el programa.
  6. use autodie;
  7. use Modern::Perl;
  8.  
  9.  
  10.  
  11.  
  12.  
  13. sub recibir{
  14.     print "Estoy en new\n";
  15.    
  16.     my $grupo = @_;
  17.    
  18.     print $grupo,"\n";
  19.    
  20.     return $grupo;
  21. }
  22.  
  23. # Subrutina crearTabla.
  24.  
  25. sub  crearTabla {
  26.  
  27.       my($conexion,$tabla);
  28.  
  29.       $tabla = $_[0];
  30.  
  31.       $conexion = $_[1];                                                                           #Desde la llamada a la subrutina le pasamos la  conexión a  la base de datos. Desde la llamada  sería la  segunda  variable  que le pasamos.
  32.  
  33.       eval  {$conexion->do("CREATE TABLE $tabla (nombre VARCHAR(30), correo VARCHAR(100))")};     #Hacemos un eval, cuya función será dejar que la tabla   se cree o no dependiendo de si existe,y desde la conexión a la  base de datos hacemos  crearemos la tabla  si  no existe  ya.
  34.  
  35.       if ($@) {
  36.  
  37.             printf("La tabla existe \n")                                                            # Se captura el error si la tabla existe y nos dice que "La  tabla  existe".
  38.  
  39.       }
  40.  
  41. }
  42.  
  43.  
  44. #Subrutina  comprobarDB.
  45.  
  46. sub comprobarDB {
  47.  
  48.  
  49.         my @databases = DBI->data_sources("mysql", {host => 'localhost', user => 'root', password => ''});# Cogemos la lista de bases de datos presentes en el sistema.
  50.  
  51.         my $base_datos = 'contactos';                              #Introducimos el nombre de la  base de datos que queremos comprobar que está  en la variable $base_datos.
  52.  
  53.         my $dsn = "DBI:mysql:$base_datos";                         # Conformamos el DSN de esa base de datos.
  54.  
  55.         unless ($dsn ~~ @databases) {                              # Si el $dsn no está entre las @databases la creamos.
  56.  
  57.                 my $drh = DBI->install_driver("mysql");            # Carga del controlador mysql
  58.  
  59.                 my $rc = $drh->func("createdb", $base_datos, 'localhost', 'root', '', 'admin');# Creamos la base de datos.
  60.         }
  61.  
  62. }
  63.  
  64.  
  65. # Conectar base de datos y mirar si existe.
  66.  
  67. &comprobarDB();               # Llamada a subrutina CompararDB.
  68.  
  69.  
  70. my($conexion,$sth,$grupo);               # Decalaración de las  variables que utilizaremos a continuación.
  71.  
  72. $conexion = ConectarDBcon->connect(); #  Conectamos con la  base de datos desde el paquete ConectarDB y lo dejamos en la variable $dbh.
  73.  
  74.  
  75. $grupo  = &recibir();
  76. #Leer datos.
  77.  
  78. print "$grupo\n";
  79.  
  80.  
  81. #Crear.
  82.  
  83. &crearTabla($grupo, $conexion);
  84.  
  85.  
  86. #Desconectar.
  87.  
  88. $conexion->disconnect;
  89.  
  90. 1;


Si alguien ve cuál puede ser el fallo por el que se ejecuta el programa na más inciar la interfaz.


Nota 2011-09-16 11:29 @520
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10249
Re: Crear interfaz gráfica con Win32::GUI
Te cuento qué es lo que está pasando...

En la línea 11 del interfaz estás dando la orden de la importación del espacio de nombres del módulo crearGrupo.

Perl busca, lee, y ejecuta el contenido de ese módulo.

Eso quiere decir que, aparte de la definición de todas las subrutinas, también ejecutará todo código ejecutable que encuentre.

Esto lo hace Perl por la siguiente razón: si, tras ejecutar el código del módulo, el resultado (la última instrucción ejecutada dentro del módulo) devuelve un valor positivo, entonces Perl asume que la carga ha sido correcta.

Como lo normal es que los módulos solo contengan definiciones de subrutinas, métodos y variables (ningún código directamente ejecutable), esa es la razón por la cual se coloca un '1;' como última línea del módulo, para que Perl acepte la carga del módulo.

Pero en tu caso... sí que hay código ejecutable: a partir de la línea 67 del módulo.

Esa es la razón por la cual sale el mensaje de "new": Perl está ejecutando ese trozo de código (la línea 75), cuando llega a la línea 11 del interfaz.

Algunas veces sí que es interesante que se ejecute código en el momento de la carga del módulo, como por ejemplo, código de inicialización.

Tu verás qué quieres que haga ese código, en ese momento.

En cuanto a los mensajes de los ceros, se produce por lo siguiente.

En la línea 75 del módulo, estás llamando a recibir(), sin ningún argumento. En las líneas 13 a 21 del módulo está ese método. En la línea 16 estás asignando el número de argumentos pasados a recibir() a la variable $grupo. Como no has pasado ninguno, el valor es cero, y eso es lo que imprime.

Repasa mi mensaje anterior.

_________________
JF^D Perl programming


Nota 2011-09-16 11:42 @529

Perlero Frecuente
Registrado: 2011-04-04 10:06 @462
Mensajes: 133
Re: Crear interfaz gráfica con Win32::GUI
Vale, una pregunta. Si yo uso use crearGrupo; eso significa que ya puedo usar todas las subrutinas y todo del módulo pero también leí en un tema, no me acuerdo muy bien cuál, que no hace falta cargar el módulo; simplemente realizando una llamada con system() o qx(), si no recuerdo mal. De esta manera, no ejecutaría el módulo y solo lo haría cuando yo pulsase el botón, ¿no?


Nota 2011-09-16 12:08 @547
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10249
Re: Crear interfaz gráfica con Win32::GUI
Si usas system() o qx() (o do()) ya estás ejecutando el código.

Si lo que quieres es que esa parte del código se ejecute cuando pulsas un botón, lo que tienes que hacer es "encerrar" ese código dentro de un método, que será llamado por la subrutina del botón.

Si quieres ejecutar código en el arranque del módulo, puedes meter el código dentro del método especial BEGIN{}.

De esa manera, ya no queda código ejecutable suelto dentro del módulo, salvo el venerable '1;'.

Si haces un perldoc -f require verás el código al que se equivale require (que es otra versión de use), y verás que, después de localizar el módulo, lo carga y ejecuta con un do(). Y luego comprueba que el resultado de esa ejecución sea 'verdadero',

_________________
JF^D Perl programming


Nota 2011-09-19 05:49 @284

Perlero Frecuente
Registrado: 2011-04-04 10:06 @462
Mensajes: 133
Re: Crear interfaz gráfica con Win32::GUI
He intentado lo del BEGIN{} pero me dice en la línea 73 "BEGIN failed--compilation aborted"

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. #!c:/perl/bin
  2.  
  3. package crearGrupo;                
  4. use DBI;
  5. use ConectarDBcon;                                      # Módulos requeridos  por el programa.
  6. use autodie;
  7. use Modern::Perl;
  8.  
  9. # Subrutina crearTabla.
  10.  
  11. sub  crearTabla {
  12.  
  13.       my($conexion,$tabla);
  14.  
  15.       $tabla = $_[0];
  16.  
  17.       $conexion = $_[1];                                                                           #Desde la llamada a la subrutina le pasamos la  conexión a  la base de datos. Desde la llamada  sería la  segunda  variable  que le pasamos.
  18.  
  19.       eval  {$conexion->do("CREATE TABLE $tabla (nombre VARCHAR(30), correo VARCHAR(100))")};     #Hacemos un eval, cuya función será dejar que la tabla   se cree o no dependiendo de si existe,y desde la conexión a la  base de datos hacemos  crearemos la tabla  si  no existe  ya.
  20.  
  21.       if ($@) {
  22.  
  23.             printf("La tabla existe \n")                                                            # Se captura el error si la tabla existe y nos dice que "La  tabla  existe".
  24.  
  25.       }
  26.  
  27. }
  28.  
  29.  
  30. #Subrutina  comprobarDB.
  31.  
  32. sub comprobarDB {
  33.  
  34.  
  35.         my @databases = DBI->data_sources("mysql", {host => 'localhost', user => 'root', password => 'password'});# Cogemos la lista de bases de datos presentes en el sistema.
  36.  
  37.         my $base_datos = 'contactos';                              #Introducimos el nombre de la  base de datos que queremos comprobar que está  en la variable $base_datos.
  38.  
  39.         my $dsn = "DBI:mysql:$base_datos";                         # Conformamos el DSN de esa base de datos.
  40.  
  41.         unless ($dsn ~~ @databases) {                              # Si el $dsn no está entre las @databases la creamos.
  42.  
  43.                 my $drh = DBI->install_driver("mysql");            # Carga del controlador mysql
  44.  
  45.                 my $rc = $drh->func("createdb", $base_datos, 'localhost', 'root', 'password', 'admin');# Creamos la base de datos.
  46.         }
  47.  
  48. }
  49.  
  50.  
  51. # Conectar base de datos y mirar si existe.
  52. BEGIN{
  53.     &comprobarDB();               # Llamada a subrutina CompararDB.
  54.  
  55.     my $grupo = @_;
  56.     my($conexion,$sth);               # Decalaración de las  variables que utilizaremos a continuación.
  57.  
  58.     $conexion = ConectarDBcon->connect(); #  Conectamos con la  base de datos desde el paquete ConectarDB y lo dejamos en la variable $dbh.
  59.  
  60.     #Leer datos.
  61.  
  62.     print "$grupo\n";
  63.  
  64.  
  65.     #Crear.
  66.  
  67.     &crearTabla($grupo, $conexion);
  68.  
  69.  
  70.     #Desconectar.
  71.  
  72.     $conexion->disconnect;
  73. }
  74. 1;


Nota 2011-09-19 06:21 @306
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10249
Re: Crear interfaz gráfica con Win32::GUI
El problema con BEGIN es que se ejecuta inmediatamente, incluso antes de que sea compilado el resto del programa.

Quizás sea mejor que el código de inicialización sea arrancado desde el programa principal.

Meterlo en un new o init, por ejemplo.

_________________
JF^D Perl programming


Nota 2011-09-19 06:42 @320

Perlero Frecuente
Registrado: 2011-04-04 10:06 @462
Mensajes: 133
Re: Crear interfaz gráfica con Win32::GUI
No sé si he entendido bien lo que me dijiste, creo que sí. Hice esto:

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. sub init{
  2.     &comprobarDB();               # Llamada a subrutina CompararDB.
  3.  
  4.     my $grupo = @_;
  5.     my($conexion,$sth);               # Declaración de las  variables que utilizaremos a continuación.
  6.  
  7.     $conexion = ConectarDBcon->connect(); #  Conectamos con la  base de datos desde el paquete ConectarDB y lo dejamos en la variable $dbh.
  8.  
  9.     #Leer datos.
  10.  
  11.     print "$grupo\n";
  12.  
  13.  
  14.     #Crear.
  15.  
  16.     &crearTabla($grupo, $conexion);
  17.  
  18.  
  19.     #Desconectar.
  20.  
  21.     $conexion->disconnect;
  22.    
  23. }
  24. # Subrutina crearTabla.
  25.  
  26. sub  crearTabla {
  27.  
  28.       my($conexion,$tabla);
  29.  
  30.       $tabla = $_[0];
  31.  
  32.       $conexion = $_[1];                                                                           #Desde la llamada a la subrutina le pasamos la  conexión a  la base de datos. Desde la llamada  sería la  segunda  variable  que le pasamos.
  33.  
  34.       eval  {$conexion->do("CREATE TABLE $tabla (nombre VARCHAR(30), correo VARCHAR(100))")};     #Hacemos un eval, cuya función será dejar que la tabla   se cree o no dependiendo de si existe,y desde la conexión a la  base de datos hacemos  crearemos la tabla  si  no existe  ya.
  35.  
  36.       if ($@) {
  37.  
  38.             printf("La tabla existe \n")                                                            # Se captura el error si la tabla existe y nos dice que "La  tabla  existe".
  39.  
  40.       }
  41.  
  42. }
  43.  
  44.  
  45. #Subrutina  comprobarDB.
  46.  
  47. sub comprobarDB {
  48.  
  49.  
  50.         my @databases = DBI->data_sources("mysql", {host => 'localhost', user => 'root', password => 'password'});# Cogemos la lista de bases de datos presentes en el sistema.
  51.  
  52.         my $base_datos = 'contactos';                              #Introducimos el nombre de la  base de datos que queremos comprobar que está  en la variable $base_datos.
  53.  
  54.         my $dsn = "DBI:mysql:$base_datos";                         # Conformamos el DSN de esa base de datos.
  55.  
  56.         unless ($dsn ~~ @databases) {                              # Si el $dsn no está entre las @databases la creamos.
  57.  
  58.                 my $drh = DBI->install_driver("mysql");            # Carga del controlador mysql
  59.  
  60.                 my $rc = $drh->func("createdb", $base_datos, 'localhost', 'root', 'password', 'admin');# Creamos la base de datos.
  61.         }
  62.  
  63. }
  64.  
  65.  
  66. 1;


y la llamada desde la interfaz:
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. sub Button13_Click {
  2.         my $texto = $ventanaCG->TextFieldcg1->Text();
  3.         print $texto,"\n";
  4.        
  5.         crearGrupo->init($texto);
  6.        
  7.         $ventanaCG->TextFieldcg2->Text("Listo!!!!!");  
  8.         return 0;
  9. };



No me crea todavía el grupo y cuando ejecuto me devuelve el nombre que puse en textfield y un 2 después; el nombre es del print() de la interfaz y el 2 será del print() del init(). Hay algo que estoy haciendo mal, pero no sé qué es.


Nota 2011-09-19 07:13 @342
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10249
Re: Crear interfaz gráfica con Win32::GUI
El error está en la línea 4, por algo que ya te he explicado dos veces, en dos mensajes anteriores.

_________________
JF^D Perl programming


Nota 2011-09-19 09:37 @442

Perlero Frecuente
Registrado: 2011-04-04 10:06 @462
Mensajes: 133
Re: Crear interfaz gráfica con Win32::GUI
Si es que he usado las tres opciones pero si uso my $grupo=@_; me escribe un 2; si uso my ($grupo)=@_; y my $grupo=shift; me escribe crearGrupo siempre, no el nombre que introduzco yo. ¿Puede ser por la llamada que hago desde la interfaz?


Nota 2011-09-19 11:26 @518
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10249
Re: Crear interfaz gráfica con Win32::GUI
Cuando, en la línea 5, pones

crearGrupo->init($texto);

Perl mete en la pila de argumentos, el valor 'crearGrupo' y luego el de $texto.

Por eso te sale un 2 cuando no pones paréntesis. Y te sale 'crearGrupo' cuando lo usas bien.

Lo único que te falta es extraer el valor de grupo de forma correcta:

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. my $self  = shift;
  2. my $grupo = shift;

_________________
JF^D Perl programming


Nota 2011-09-23 09:45 @448

Perlero Frecuente
Registrado: 2011-04-04 10:06 @462
Mensajes: 133
Re: Crear interfaz gráfica con Win32::GUI
Hola. Pongo esta duda por si alguien tiene alguna idea u opinión sobre qué hacer. Tengo la interfaz hecha pero me falta una cosa que me está dando muchos quebraderos de cabeza. Quiero poder mostrar los datos de los usuarios de la base de datos y poder seleccionarlos. El ejemplo que puse al principio es el de los correos de Hotmail. Se muestran los correos y al lado de cada uno un cuadradito para seleccionarlo. En este caso sería un RadioButton pero, claro, tengo problemas para mostrar los datos. Uso :

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. $ventanaC->AddTextfield(
  2.     -name      => "Mostar",
  3.     -pos       => [200, 50],
  4.     -size      => [360, 400],
  5.     -multiline => 1,
  6.     -hscroll   => 1,
  7.     -vscroll   => 1,
  8.     -autohscroll => 1,
  9.     -autovscroll => 1,
  10.     -keepselection => 1 ,
  11.     -font => $EditFont,
  12.     -onResize   => \&Notepad_OnSize,
  13. );


y claro, con
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. $ventanaC->Mostar->Text("");


pero no sé cómo hacerlo para dividirlo en filas.

He pensado también si poder hacer una tabla.


Responder al tema  [ 62 mensajes ]  Ir a página 1, 2, 3, 4, 5  Siguiente

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