Не удается запустить EVT_KEY_DOWN в wxPerl

В этом случае $self является подклассом Wx::Frame, и я могу добавлять элементы управления, меню и т. Д. Во фрейм. Однако я не могу добавить ключевые события. Я использую следующее, чтобы добавить ключевое событие:

  EVT_KEY_DOWN($self,  \&_process_char);

Функция _process_char выглядит так:

sub _process_char {
   my ($evt) = @_;
   warn 'key pressed';
}

Событие не срабатывает. Что я делаю неправильно? Как сделать так, чтобы события нажатия клавиш работали с wxperl?


person Chris Travers    schedule 26.10.2013    source источник


Ответы (1)


Это связано с распространением событий - textctrl обрабатывает события keydown / keyup, а событие по умолчанию (обработчик textctrl по умолчанию) не будет распространять эти события UP на фрейм. Если вы хотите, чтобы ваш обработчик вызывал привязку к 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 - есть EVT_CHAR только для символов :)

обновление: в примере с записной книжкой замените (в примере выше) около $text на

    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 );
person optional    schedule 27.10.2013
comment
Не удается ли элементу управления ноутбуком распространять события клавиатуры вверх? Если да, то это может быть моей проблемой. Однако у меня проблемы с отладкой. - person Chris Travers; 27.10.2013
comment
Нет, это окно, как и фрейм, оно будет распространять события клавиатуры вверх (все те, которые не обрабатываются). Но что бы вы ни делали, вы всегда можете выполнить привязку к $app, и это должно сработать. If my answers aren't helping, you should post code that demonstrates your problem. - person optional; 30.10.2013
comment
Ответ принят, но ... Я обнаружил, что то, что я пытался сделать, было неправильным, и поэтому я полностью отказался от этого метода. По-видимому, команды ctrl-key лучше всего запускать из строк меню в Windows ... так что это не решило мою проблему, а больше по причинам, выходящим за рамки вашего вопроса. - person Chris Travers; 16.11.2013