Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 
Índice general » Mundo Perl » Básico » Pasar datos de un array a una simplelist Responder al tema
Nuevo tema


Página 1 de 1  [ 11 mensajes ] 
 
Nota 2011-12-08 15:51 @702

Perlero Nuevo
Registrado: 2011-12-08 15:16 @678
Mensajes: 13
Pasar datos de un array a una simplelist
¡Hola!

Soy Gonzalo desde Uruguay, primera vez que pregunto algo en el foro...

Soy muy nuevo en Perl y tengo un problemita.

Estoy tratando de usar gtk2-perl y el tema es el siguiente:

Quiero tratar de poner los datos del array en una simplelist y luego mostrarlos en un frame con un scrolledwindow y no lo puedo hacer...

Mi código es este:
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. ...
  2. my $args = shift;
  3. $args->{results}= Gtk2::SimpleList->new(
  4.      name => 'text'
  5. );
  6.        
  7. my $window2 = Gtk2::Window->new('toplevel');
  8. $window2->set_default_size( 300, 450 ); # Tamaño inicial
  9. $window2->set_border_width( 5 ); # Tamaño del borde
  10.  
  11.    
  12. my $usr_entry = Gtk2::Entry->new;
  13. $usr_entry->set_text ("Ingresar Usuario");
  14.    
  15. my $buscar_btn = Gtk2::Button->new_from_stock('Buscar');
  16. $buscar_btn->signal_connect( clicked => sub{
  17.         my args->{results} ='shift';
  18.  
  19.         my @listado;  #### suponemos que @listado tiene algún elemento
  20.  
  21.         my $resultwidget = Gtk2::SimpleList->new(
  22.              name => 'text'   #la lista solo tendría una columna
  23.         );
  24.                
  25.         foreach (@listado) {
  26.    ###eh aquí uno de los tantos intentos por poder poner los datos
  27.    ###del array en la lista....
  28.                push @{$resultwidget->{data}},"$_";
  29.                print "$_"; ###En la consola me imprime bien los datos
  30.         }
  31.                                                
  32.         $args->{results}=$resultwidget;
  33.        
  34.         });
  35.        
  36. my $vbbox = Gtk2::VButtonBox->new;
  37. $vbbox->set_layout( 'start' );
  38. $vbbox->set_spacing( 1 );
  39. $vbbox->add($usr_entry);
  40. $vbbox->add($buscar_btn);
  41.  
  42. my $frame = Gtk2::Frame->new( '  Resultados  ' );
  43. $frame->set_border_width( 5 );
  44. $frame->set_size_request( 200, 200 );
  45.  
  46. my $sc = Gtk2::ScrolledWindow->new;
  47. $sc->set_policy( 'automatic', 'automatic' );
  48. $sc->add($args->{results});
  49.        
  50. $frame->add( $sc );
  51. my $vbox = Gtk2::VBox->new( FALSE, 1 );
  52. $vbox->pack_start($vbbox, FALSE, FALSE, 1 );
  53. $vbox->pack_end($frame, 1, 1, 0 );
  54.                
  55. $window2->add( $vbox );
  56. $window2->show_all;
  57.  


El problema reside en poner los datos del arreglo @listado en la lista $resultwidget y hacer que ese resultado se vea desde fuera de la subrutina invocada al hacer clic en el botón "buscar".

Espero que quede claro lo que trato de explicar.

¡Muchas gracias y saludos!


Nota 2011-12-08 16:07 @713
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10268
Re: Pasar datos de un array a una simplelist
Bienvenido a los foros de Perl en español, 60N2410.

Cambia las líneas 25 a 30 por esta línea:
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1.         push @{$resultwidget->{data}}, [ @listado ];

Sacado de la sinopsis de la página de manual de Gtk2::SimpleList.

_________________
JF^D Perl programming


Nota 2011-12-08 16:34 @732

Perlero Nuevo
Registrado: 2011-12-08 15:16 @678
Mensajes: 13
Re: Pasar datos de un array a una simplelist
¡Muchas, pero muchas gracias por responder y con esa rapidez!

Hice lo que me has dicho y debajo dejé el foreach() solo con un print() para ver el contenido del arreglo y cambié la lista para ahora tener 2 campos...

Te muestro la salida que me da el programa al hacer el cambio:
Syntax: [ Download ] [ Hide ]
Using text Syntax Highlighting
gonzalo.astorga SI
gonzalo.barbieri NO
gonzalo.bermudez NO
gonzalo.capo SI
gonzalo.fernandez SI
gonzalo.garcia SI
gonzalo.lippo SI
gonzalo.marquez NO
gonzalo.milans SI
gonzalo.niz NO
can't set value for column 2, model only has 2 columns at /usr/lib/perl5/Gtk2/SimpleList.pm line 252.
can't set value for column 3, model only has 2 columns at /usr/lib/perl5/Gtk2/SimpleList.pm line 252.
can't set value for column 4, model only has 2 columns at /usr/lib/perl5/Gtk2/SimpleList.pm line 252.
can't set value for column 5, model only has 2 columns at /usr/lib/perl5/Gtk2/SimpleList.pm line 252.
can't set value for column 6, model only has 2 columns at /usr/lib/perl5/Gtk2/SimpleList.pm line 252.
can't set value for column 7, model only has 2 columns at /usr/lib/perl5/Gtk2/SimpleList.pm line 252.
can't set value for column 8, model only has 2 columns at /usr/lib/perl5/Gtk2/SimpleList.pm line 252.
can't set value for column 9, model only has 2 columns at /usr/lib/perl5/Gtk2/SimpleList.pm line 252.


No logro que se muestre ningún resultado en la ventanita todavía y ¡no sé por qué quiere setear 9 valores!

Perdón por las molestias y ¡muchas gracias!


Nota 2011-12-08 16:51 @743
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10268
Re: Pasar datos de un array a una simplelist
Sin ver el contenido del arreglo, es difícil decirlo.

Los mensajes de error creo que se refiere a que el arreglo contiene datos para nueve columnas, pero la simplelist solo tiene dos.

Usando Data::Dumper podemos ver la verdadera estructura de @listado.

O copia aquí la parte del código donde le das los valores a @listado.

_________________
JF^D Perl programming


Nota 2011-12-09 09:03 @418

Perlero Nuevo
Registrado: 2011-12-08 15:16 @678
Mensajes: 13
Re: Pasar datos de un array a una simplelist
¡Buenos días!

Declaración de la lista:
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. my $resultwidget = Gtk2::SimpleList->new(
  2.         Usuario => 'text',
  3.         Correo => 'text',
  4. );
  5.  


Los valores a @listado se los doy así:
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. my $uid; #uid es el nombre de un usuario.....
  2. if (condición){
  3.         push @list , "$uid SI";
  4. }else{
  5.         push @list , "$uid NO";
  6. }
  7.  


Contenido del arreglo @listado con Dumper:
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. $VAR1 = 'gonzalo.astorga SI';
  2. $VAR2 = 'gonzalo.barbieri NO';
  3. $VAR3 = 'gonzalo.bermudez NO';
  4. $VAR4 = 'gonzalo.capo SI';
  5. $VAR5 = 'gonzalo.fernandez SI';
  6. $VAR6 = 'gonzalo.garcia SI';
  7. $VAR7 = 'gonzalo.lippo SI';
  8. $VAR8 = 'gonzalo.marquez NO';
  9. $VAR9 = 'gonzalo.milans SI';
  10. $VAR10 = 'gonzalo.niz NO';


Mirando bien esto, creo que está mal para lo que quiero hacer...

Mi idea es poner en el primer campo de la lista el usuario y en el segundo campo de la lista el valor "SI" o "NO". Pero no logro mostrar nada en la lista, ni siquiera teniendo un solo valor en el arreglo.
Quizás no logro ver bien el valor de la lista fuera de la subrutina.

¡Muchas gracias!


Nota 2011-12-09 10:13 @467
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10268
Re: Pasar datos de un array a una simplelist
Pues tienes razón, te he dado una mala solución.

A ver... si se trata de que tiene que haber dos columnas, primero hay que partir cada valor en esas dos columnas.

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. my @listado = (
  2.     'gonzalo.astorga SI',
  3.     'gonzalo.barbieri NO',
  4.     'gonzalo.bermudez NO',
  5.     'gonzalo.capo SI',
  6.     'gonzalo.fernandez SI',
  7.     'gonzalo.garcia SI',
  8.     'gonzalo.lippo SI',
  9.     'gonzalo.marquez NO',
  10.     'gonzalo.milans SI',
  11.     'gonzalo.niz NO',
  12. );
  13. for my $entrada (@listado) {
  14.     my($nombre, $correo) = split " ", $entrada;           # partimos por el espacio en blanco
  15.     push @{$resultwidget->{data}}, [ $nombre, $correo ];  # agregamos una fila más, con dos columnas
  16. }

Ahora sí que debería funcionar...

_________________
JF^D Perl programming


Nota 2011-12-09 12:50 @576

Perlero Nuevo
Registrado: 2011-12-08 15:16 @678
Mensajes: 13
Re: Pasar datos de un array a una simplelist
¡Hola!
Ahora mi problema cambió...

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. my $buscar_btn = Gtk2::Button->new_from_stock('Buscar');
  2. $buscar_btn->signal_connect( clicked => sub{
  3.    .......
  4.           #esta subrutina me genera un arreglo @resultado con los datos
  5.           #tal y como me lo has dicho anteriormente
  6.         });
  7.  


Con el arreglo generado en la subrutina necesito, fuera de ella, generar la lista para desplegarla en pantalla en una scrolledwindow dentro de un frame.

El problema reside en que no puedo leer el arreglo generado en la subrutina fuera de la misma, ya he intentado pasarla por parámetro y no he tenido suerte.

Disculpas por tantas preguntas pero es que son mis primeras experiencias en Perl.

¡Un saludo desde Uruguay!
Muchas gracias.


Nota 2011-12-09 16:03 @710
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10268
Re: Pasar datos de un array a una simplelist
Seguramente el arreglo lo estás guardando en una variable local al contexto de esa subrutina. Por eso no es conocida fuera.

Sin ver el código, no hay más pistas.

_________________
JF^D Perl programming


Nota 2011-12-12 14:51 @660

Perlero Nuevo
Registrado: 2011-12-08 15:16 @678
Mensajes: 13
Re: Pasar datos de un array a una simplelist
¡Hola!

Me acabo de dar cuenta de que el problema no es leer el arreglo fuera de la subrutina, sino que al hacer clic en el botón que me llama a la subrutina, el programa nunca sale de ella. Por ejemplo:

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. .......
  2. my $buscar_btn = Gtk2::Button->new_from_stock('Buscar');
  3. my @listado=("A");
  4. $buscar_btn->signal_connect( clicked =>
  5. sub{
  6.         my ($args,@listado )= @_ ;
  7.         foreach (@listado){
  8.                 print "$_\n";
  9.         }
  10.         push @listado , "gonzalo", "NO";
  11.         print "1\n";
  12.         foreach (@listado){
  13.                 print "$_\n";
  14.         }
  15.         print "2\n";
  16.         return TRUE;
  17. }, [$args,@listado]);
  18.  
  19. print "3\n"
  20. foreach (@listado){
  21.         print "$_\n";
  22. }
  23. .......
  24.  


Y la salida del programa es:

Syntax: [ Download ] [ Hide ]
Using text Syntax Highlighting
3                       #Al abrir el programa
A      
ARRAY(0x8ee27d8)        #Al hacer click en el botón Buscar
1
gonzalo
NO
2                       #Nunca llega a imprimir 3 y queda esperando a que haga click
ARRAY(0x8ee27d8)        #Al hacer click nuevamente en el botón Buscar
1
gonzalo
NO
2                       #Nunca llega a imprimir 3
 


No puedo imprimir @listado luego de la subrutina porque nunca sale de ella, queda como en un "loop" dentro de la subrutina, es muy raro esto.

Saludos.


Nota 2011-12-12 15:38 @693
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10268
Re: Pasar datos de un array a una simplelist
El '3' no sale porque está fuera de la subrutina. Cuando el programa llega al Gtk2->main, es el Gtk el que toma todo el control y no continúa a partir de ese punto.

La subrutina que debe gestionar la pulsación del botón siempre recibe dos escalares: el nombre del widget, y los datos. Repito: escalares. Eso quiere decir que la parte de datos del usuario no es una lista de valores, sino una referencia a esa lista. La lista la podemos indicar como una lista anónima, como la tienes puesta, pero también como un hash anónimo (ver ejemplos).

Entonces, la forma correcta de pasar @listado a la subrutina, debería ser así (no probado):
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. $buscar_btn->signal_connect(
  2.     clicked =>
  3.         sub {
  4.             my $boton = shift;
  5.             my $ref   = shift;        # Referencia a la lista de datos
  6.             my @listado = @{$ref};    # Sacamos una copia de los datos en un nuevo @listado local
  7.             foreach (@listado){
  8.                 print "$_\n";
  9.             }
  10.             return;
  11.         },
  12.         \@listado                     # Pasamos la ref. a nuestro @listado
  13. );

_________________
JF^D Perl programming


Nota 2011-12-12 16:58 @748

Perlero Nuevo
Registrado: 2011-12-08 15:16 @678
Mensajes: 13
Re: Pasar datos de un array a una simplelist
Muchas gracias por la ayuda, ¡un fenómeno! :D
¡¡Ahora si me salió!! :lol:

¡Saludos!

PD: Seguramente me tengas de nuevo por acá... ¡je!


Responder al tema  [ 11 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:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traducción al español por Huan Manwë para phpbb-es.com
phpBB SEO