• Publicidad

Pasar datos de un array a una simplelist

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Pasar datos de un array a una simplelist

Notapor 60N2410 » 2011-12-08 15:51 @702

¡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:
Sintáxis: [ Descargar ] [ Ocultar ]
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.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


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!
60N2410
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2011-12-08 15:16 @678

Publicidad

Re: Pasar datos de un array a una simplelist

Notapor explorer » 2011-12-08 16:07 @713

Bienvenido a los foros de Perl en español, 60N2410.

Cambia las líneas 25 a 30 por esta línea:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.         push @{$resultwidget->{data}}, [ @listado ];
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Sacado de la sinopsis de la página de manual de Gtk2::SimpleList.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Pasar datos de un array a una simplelist

Notapor 60N2410 » 2011-12-08 16:34 @732

¡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:
Sintáxis: [ Descargar ] [ Ocultar ]
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.
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


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!
60N2410
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2011-12-08 15:16 @678

Re: Pasar datos de un array a una simplelist

Notapor explorer » 2011-12-08 16:51 @743

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 & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Pasar datos de un array a una simplelist

Notapor 60N2410 » 2011-12-09 09:03 @418

¡Buenos días!

Declaración de la lista:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $resultwidget = Gtk2::SimpleList->new(
  2.         Usuario => 'text',
  3.         Correo => 'text',
  4. );
  5.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Los valores a @listado se los doy así:
Sintáxis: [ Descargar ] [ Ocultar ]
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.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Contenido del arreglo @listado con Dumper:
Sintáxis: [ Descargar ] [ Ocultar ]
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';
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


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!
60N2410
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2011-12-08 15:16 @678

Re: Pasar datos de un array a una simplelist

Notapor explorer » 2011-12-09 10:13 @467

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.

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

Ahora sí que debería funcionar...
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Pasar datos de un array a una simplelist

Notapor 60N2410 » 2011-12-09 12:50 @576

¡Hola!
Ahora mi problema cambió...

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


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.
60N2410
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2011-12-08 15:16 @678

Re: Pasar datos de un array a una simplelist

Notapor explorer » 2011-12-09 16:03 @710

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 & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Pasar datos de un array a una simplelist

Notapor 60N2410 » 2011-12-12 14:51 @660

¡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:

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


Y la salida del programa es:

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


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.
60N2410
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2011-12-08 15:16 @678

Re: Pasar datos de un array a una simplelist

Notapor explorer » 2011-12-12 15:38 @693

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):
Sintáxis: [ Descargar ] [ Ocultar ]
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. );
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Siguiente

Volver a Básico

¿Quién está conectado?

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