在本例中,$self是Wx::Frame的子类,我可以将控件、菜单等添加到框架中。但是,我不能添加关键事件。我使用以下方法添加关键事件:
EVT_KEY_DOWN($self, \&_process_char);_process_char函数如下所示:
sub _process_char {
my ($evt) = @_;
warn 'key pressed';
}这件事不会开火的。我做错了什么?如何让按键事件与wxperl一起工作?
发布于 2013-10-27 06:12:14
这与事件传播有关-- textctrl处理按键/按键事件,而默认事件(默认textctrl处理程序)不会将这些事件传播到框架中。如果希望将处理程序调用为,则绑定到wxTheApp()或textctrl。下面是一个例子,其中并不是所有的键都被传播。
#!/usr/bin/perl --
use strict; use warnings;
use Wx ();
Main( @ARGV );
exit( 0 );
sub Main {
local $| = 1;
my $app = Wx::SimpleApp->new;
my $frame = Wx::Frame->new( undef, -1, "type stuff ", ([250,150])x2 );
my $text = Wx::TextCtrl->new( $frame, -1,"", );
$app->SetTopWindow( $frame );
my $target = @_ ? $frame : $text;
Wx::Event::EVT_KEY_DOWN( $target , \&Frobnicate );
Wx::Event::EVT_KILL_FOCUS($app, sub{ Wx::wxTheApp()->ExitMainLoop });
$app->{counter} = 0;
$frame->Show;
$text->SetFocus;
$app->MainLoop;
}
sub Frobnicate {
my( $widget, $kev )=@_;
my $app = Wx::wxTheApp();
my $count = $app->{counter}++;
my $frame = $app->GetTopWindow;
my $title = $frame->GetTitle;
$title =~ s{\d*+$}{$count};
$frame->SetTitle( $title );
$kev->Skip if 0 == $count % 4; ## sometimes :P
}此外,您还调用了处理程序_process_char,但是使用了EVT_KEY_DOWN --有一个仅用于chars的EVT_CHAR :)
update:对于笔记本示例(在上面的示例中),使用
my $noteb = Wx::Notebook->new( $frame );
my $text = Wx::TextCtrl->new( $noteb, -1,"", );
$noteb->AddPage( $text, "you myst type stuff");
Wx::Event::EVT_KEY_DOWN( $app, \&Frobnicate );https://stackoverflow.com/questions/19607859
复制相似问题