• Publicidad

Envío de parámetros a funciones con botón

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

Envío de parámetros a funciones con botón

Notapor lykoz » 2011-09-07 11:26 @518

Saludos

Tengo poco tiempo programando en Perl y estoy realizando una aplicación gráfica utilizando TK. En ésta quiero enviar un texto almacenado en un arreglo a otra ventana al presionar el botón, la otra ventana está definida en una función aparte. Entonces el problema que se me presenta es que al colocar la llamada a la función en el botón, ésta se ejecuta de manera automática al iniciar el programa, abriendo el mismo número de ventanas que hay de botones y después al dar clic en algún botón me muestra un mensaje de error:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use strict;
  2. use Tk;
  3.  
  4. my $mw=MainWindow->new;
  5. my @arreglo =('hola','mundo','todos','hoy');
  6.  
  7. my @botones=();
  8. my $i=0;
  9. for($i=0;$i<9;$i++){
  10.     $botones[$i]=$mw->Button(
  11.         -text=>$i,
  12.         #linea cambiada por sugerencia de explorer
  13.         #-command=>\&ventana($i)
  14.         -command=>sub{ ventana ($i)}#nueva linea que si realiza la llamada a la funcion
  15.     )->pack();
  16. }
  17.  
  18. MainLoop;
  19.  
  20. sub ventana{
  21.     my $in=@_;
  22.     my $pop = MainWindow->new;
  23.     my $etiqueta = $pop->Label(
  24.         -text => 'Escogiste: '.$in
  25.     )->pack();
  26. }
  27.  
  28.  
Coloreado en 0.006 segundos, usando GeSHi 1.0.8.4


El mensaje de error es:

Tk::Error: Not a CODE reference at C:/Perl64/site/lib/Tk.pm line 250.
Tk callback for .button3
Tk::__ANON__ at C:/Perl64/site/lib/Tk.pm line 250
Tk::Button::butUp at C:/Perl64/site/lib/Tk/Button.pm line 175
<ButtonRelease-1>
(command bound to event)
Última edición por lykoz el 2011-09-07 13:00 @583, editado 1 vez en total
¿Se necesita una razón para ayudar a alguien?
[Yitan FFIX]
lykoz
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2011-09-06 15:40 @694

Publicidad

Re: envío de parámetros a funciones con botón

Notapor explorer » 2011-09-07 12:38 @568

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

No estoy seguro, pero prueba a cambiar la línea
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.         -command=>\&ventana($i)
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
por
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.         -command=> sub { ventana($i) }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

De esta manera estás indicando a -command una referencia a una función (anónima), que, cuando se ejecute, lo único que se ejecuta es ventana($i).

Lo que tenías puesto es \&ventana($i), que provoca lo que comentas: ejecutar ventana($i), para cada $i, y de ahí obtiene la referencia al resultado de la ejecución, y no la referencia a ventana().
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: envío de parámetros a funciones con botón

Notapor lykoz » 2011-09-07 12:50 @576

Gracias, explorer, ha funcionado perfecto. Ahora me abre los mensajes solo cuando presiono un botón que es lo que quería que pasara, solo que no me muestra el valor de $i en el label $etiqueta ya que siempre muestra 'Escogiste: 1' cuando lo que debería mostrar es el valor del botón presionado.
¿Se necesita una razón para ayudar a alguien?
[Yitan FFIX]
lykoz
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2011-09-06 15:40 @694

Re: Envío de parámetros a funciones con botón

Notapor explorer » 2011-09-07 13:46 @615

Cambia la línea
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     my $in  = @_;     # asigna a $in el número de elementos que hay en @_
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
por
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     my($in) = @_;     # asigna a $in el primer elemento de @_
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
o por
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     my $in  = shift;  # lo mismo, pero además, reduciendo @_
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Esta última es la que más se usa.
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: Envío de parámetros a funciones con botón

Notapor lykoz » 2011-09-07 14:31 @646

Tenías razón, explorer, olvidé colocar los paréntesis para asignar el valor, y dirás que soy latoso pero el problema que me aqueja es que el valor que recibe la función es el último que obtiene la variable $i. Leyendo un poco tutoriales me he dado cuenta que mi error se debe principalmente a que provengo de programar PHP, entonces como ahí podía crear formularios con una cantidad variable de cajas de texto y botones he creído que se puede hacer lo mismo con Perl, bueno, crearlos sí, ya lo hice, entonces lo que falta por resolver es identificar que botón fue el que ha sido presionado, pensando en que sería parecido al PHP decidí mandar la variable $i como argumento pero al presionar el botón correspondiente el valor que se envía es 4, precisamente el último que obtuvo al crear los botones en la ventana.

¿Existe alguna solución? La verdad es que llevo con este problema ya 2 días y es lo único que me ha detenido, ya que forma parte de un programa más grande.
¿Se necesita una razón para ayudar a alguien?
[Yitan FFIX]
lykoz
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2011-09-06 15:40 @694

Re: Envío de parámetros a funciones con botón

Notapor explorer » 2011-09-07 15:42 @696

Pues no lo entiendo...

La siguiente versión sí que me funciona a mí:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3.  
  4. use Tk;
  5.  
  6. my $mw = MainWindow->new;
  7.  
  8. for my $i (0 .. 8) {
  9.     $mw->Button(
  10.         -text    => $i,
  11.         -command => sub{ ventana($i) },
  12.     )->pack();
  13. }
  14.  
  15. MainLoop;
  16.  
  17. sub ventana{
  18.     my($in) = shift;
  19.  
  20.     print "[$in]\n";
  21.  
  22.     MainWindow->new->Label(
  23.         -text => "Escogiste: $in",
  24.     )->pack();
  25. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
(He quitado algunas cosas, pero el código principal Tk está ahí.)
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: Envío de parámetros a funciones con botón

Notapor lykoz » 2011-09-07 16:05 @712

Gracias, explorer. El problema ha quedado resuelto, he cambiado la forma del for() en mi código:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. for($i=0;$i<9;$i++){
  2. ...
  3. }
  4.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


por:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. for my $i (0...8){
  2. ...
  3. }
  4.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


y ha funcionado, ahora voy a investigar qué diferencia hay entre una y otra forma de expresar el ciclo for() pues pensaba que funcionaban de la misma forma.
¿Se necesita una razón para ayudar a alguien?
[Yitan FFIX]
lykoz
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2011-09-06 15:40 @694

Re: Envío de parámetros a funciones con botón

Notapor explorer » 2011-09-07 16:39 @735

Interesante... yo tampoco lo veo...

my() define variables locales en el contexto en donde se encuentran, así que en el primer caso, es todo el programa, pero en el segundo caso, es solo dentro del bucle for().

Podría ser... que en el segundo caso, se cree una nueva copia de $i, en cada vuelta...

No sé... tendrá que ser un experto el que lo averigüe.
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


Volver a Básico

¿Quién está conectado?

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

cron