Perdón por no ser tan claro, y además de haberte dado una mala respuesta.
Aquí tienes un ejemplo que funciona:
Using perl Syntax Highlighting
#!/usr/bin/perl
use Tk;
my $f = MainWindow->new;
$f->title("fdf");
$f->geometry("400x400+20+20");
my $boton = $f->Button(-text=>"yeah", -command=>\&yd);
$boton->pack();
$boton->focus();
MainLoop;
sub yd {
$f->Label(-text=>"dfdfdff")->pack();
}
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
El truco es el siguiente: le damos, desde el principio, el foco de atención al botón, por lo que recibirá las pulsaciones de la tecla Entrar (y de Espacio).
Pero el problema es si vas a hacer un diálogo más complicado, con más elementos de entrada. Entonces el foco se desplazaría a esos controles.
Otra solución es "unir" la llamada a una función cuando se produzca un determinado evento. En nuestro caso, ese evento es la pulsación de la tecla
Return. Con el siguiente programa
Using perl Syntax Highlighting
#!/usr/bin/perl
use Tk;
my $f = MainWindow->new;
$f->title("fdf");
$f->geometry("400x400+20+20");
my $boton = $f->Button(-text=>"yeah", -command=>\&yd);
$boton->pack();
$f->bind('<Return>' => \&yd);
$f->focus();
MainLoop;
sub yd {
$f->Label(-text=>"dfdfdff")->pack();
}
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
ahora, al pulsar esa tecla, el evento es recogido por la ventana, y ejecutada la función yd().
Habría un problema: si el botón tiene el foco y pulsamos la tecla de entrada. Entonces la función yd() es llamada dos veces. Para solucionarlo, lo mejor es hacer el bind() no a la ventana, sino al
widget que queremos que imite la pulsación. Podría ser una caja de texto:
Using perl Syntax Highlighting
#!/usr/bin/perl -w
use strict;
use Tk;
my $mw = new MainWindow();
$mw->title ( 'Correo electronico' ) ;
$mw->Label ( -text => 'Introduzca su correo:' )
->pack ( -side => 'top' ) ;
my $resultado = $mw->Label()
->pack ( -side => 'top' ) ;
$mw->Label ( -text => 'Su correo:' )
->pack ( -side => 'left' ) ;
my $entrada = $mw->Entry ( -width => 18 , -justify => 'left' )
->pack( -side => 'left' );
$entrada->bind('<Return>', sub { entradaAetiqueta($entrada, $resultado); } ); # magia
$entrada->focus();
my $actualiza = $mw->Button ( -text => 'Actualiza', -default => 'active' )
->pack( -side => 'bottom' ) ;
$actualiza->configure ( -command => [\&entradaAetiqueta , $entrada , $resultado ] ) ;
my $cancela = $mw->Button ( -text => 'Cancelar' , -command => sub { $mw->destroy() } )
->pack ( -side => 'bottom' ) ;
MainLoop();
sub entradaAetiqueta ( $$ ) {
my ( $entrada , $etiqueta ) = @_;
$etiqueta->configure ( -text => $entrada->get() ) ;
}
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Con este ejemplo aparece la entrada de un texto sencillo. La caja de entrada ya tiene el foco y podemos empezar a escribir inmediatamente. Y al pulsar el botón de Entrar, se actualiza la etiqueta oculta. También funciona si movemos el foco de atención con la tecla tabulador y pulsamos sobre los botones con la barra de espacio o el
Return.
(sacado de
Linux Productivity Magazine, 2-2, febrero 2003)