[caracas-pm] Case statement en perl

Ernesto Hernández-Novich emhn at movistar.net.ve
Wed Apr 18 12:54:08 PDT 2007


On Wed, 2007-04-18 at 06:41 -0400, hans wrote:
> me explico:
>  En un canvas tengo 25 icons  que representan 25 switches
>  y $ x $y son los coordinados.
> Al hacer click con el raton cambia el switch (on/off).
> Al mismo momento dibujo otro icono en el lugar, para representar el
> nuevo estado del switch.

Digamos que estás programando en Gtk. En lugar de usar iconos "sueltos"
sobre el canvas, construye _25_ botones. Cada botón tendrá asociado un
"callback" que será invocado cuando le hagas click; el callback es una
rutina arbitraria que en principio puede modificar variables globales de
estado, llamar métodos sobre objetos y en particular podría cambiar el
texto/color/imagen del botón. Así, asumiendo que existe una ventana
donde colocarás los botones ($window):

for my $n (1..25) {
  my $b = Gtk2::Button->new('boton' . $n);
  $b->signal_connect( clicked => \&button_click, $n );
  $window->add($b);
}

sub button_click {
  my $number = shift;
  # Hacer lo que quieras hacer con el botón
  print "Oprimieron el boton $number!\n";
}

Nota que el '$n' que se puso en el signal_connect será pasado como
parámetro a la función button_click en el momento en que se invoque. Si
necesitas pasar más cosas, entonces tienes que pasar una referencia a un
arreglo/hash y manipularla dentro del callback. De paso, no tienes que
preocuparte por las coordenadas pues de eso se encarga Gtk.

En particular es notablemente más elegante y eficiente generar clausuras
y así no hay que pasar parámetros con cada invocación, pero no es
obligatorio.
-- 
Ernesto Hernández-Novich - Linux 2.6.18 i686 - Unix: Live free or die!
Geek by nature, Linux by choice, Debian of course.
If you can't aptitude it, it isn't useful or doesn't exist.
GPG Key Fingerprint = 438C 49A2 A8C7 E7D7 1500 C507 96D6 A3D6 2F4C 85E3



More information about the caracas-pm mailing list