首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法让EVT_KEY_DOWN在wxPerl中开火

无法让EVT_KEY_DOWN在wxPerl中开火
EN

Stack Overflow用户
提问于 2013-10-26 14:29:24
回答 1查看 339关注 0票数 1

在本例中,$selfWx::Frame的子类,我可以将控件、菜单等添加到框架中。但是,我不能添加关键事件。我使用以下方法添加关键事件:

代码语言:javascript
复制
  EVT_KEY_DOWN($self,  \&_process_char);

_process_char函数如下所示:

代码语言:javascript
复制
sub _process_char {
   my ($evt) = @_;
   warn 'key pressed';
}

这件事不会开火的。我做错了什么?如何让按键事件与wxperl一起工作?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-27 06:12:14

这与事件传播有关-- textctrl处理按键/按键事件,而默认事件(默认textctrl处理程序)不会将这些事件传播到框架中。如果希望将处理程序调用为,则绑定到wxTheApp()或textctrl。下面是一个例子,其中并不是所有的键都被传播。

代码语言:javascript
复制
#!/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:对于笔记本示例(在上面的示例中),使用

代码语言:javascript
复制
    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 );
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19607859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档