WxWidget/WxPerl,更多 WxApp 实例,EVENT 处理
WxWidget/WxPerl, more instances of WxApp, EVENT handling
我正在尝试制作一个脚本,它创建 一个简单的 window(它继承自 WxApp)。 Window 仅包含一个按钮和用于单击事件的处理程序。
当存在多个 window 时,处理点击事件时出现问题。如果 window 仅存在一个实例,则事件被正确检测到。看起来,事件总是在最后创建的 window 中正确运行。我想不通,哪里可能有问题...在此示例中,在第一个创建的 window 中单击按钮后,似乎 事件在第二个 window 中被捕获。它打印“2”到控制台,而不是“1”。
package MyApp;
use base 'Wx::App';
use strict;
use warnings;
use Wx;
use aliased 'Widgets::Forms::MyWxFrame';
sub new {
my $self = shift;
$self = {};
$self = Wx::App->new( \&OnInit );
bless($self);
$self->{"windowNumber"} = shift;
my $mainFrm = MyWxFrame->new(
undef,
-1,
"My app - ".$self->{"windowNumber"},
&Wx::wxDefaultPosition
);
my $button = Wx::Button->new( $mainFrm, -1, "Test btn", );
Wx::Event::EVT_BUTTON( $button, -1, sub { __OnClick( $self, @_ ) } );
$mainFrm->Show(1);
return $self;
}
sub OnInit {
return 1;
}
sub __OnClick {
my $self = shift;
my $btn = shift;
my $event = shift;
print $self->{"windowNumber"};
}
my $myApp = MyApp->new(1);
my $myApp2 = MyApp->new(2);
$myApp->MainLoop;
您似乎对 wxApp
和 wxFrame
之间的区别感到非常困惑。第一个代表整个应用程序,并且只能有一个(无论如何在非病态情况下)。要创建多个顶级 windows,创建多个 wxFrames
就足够了,但您的代码并没有这样做,它实际上创建了多个 wxApp
实例。
不要这样做,创建一个 wxApp
,然后根据需要创建尽可能多的 windows。
我正在尝试制作一个脚本,它创建 一个简单的 window(它继承自 WxApp)。 Window 仅包含一个按钮和用于单击事件的处理程序。
当存在多个 window 时,处理点击事件时出现问题。如果 window 仅存在一个实例,则事件被正确检测到。看起来,事件总是在最后创建的 window 中正确运行。我想不通,哪里可能有问题...在此示例中,在第一个创建的 window 中单击按钮后,似乎 事件在第二个 window 中被捕获。它打印“2”到控制台,而不是“1”。
package MyApp;
use base 'Wx::App';
use strict;
use warnings;
use Wx;
use aliased 'Widgets::Forms::MyWxFrame';
sub new {
my $self = shift;
$self = {};
$self = Wx::App->new( \&OnInit );
bless($self);
$self->{"windowNumber"} = shift;
my $mainFrm = MyWxFrame->new(
undef,
-1,
"My app - ".$self->{"windowNumber"},
&Wx::wxDefaultPosition
);
my $button = Wx::Button->new( $mainFrm, -1, "Test btn", );
Wx::Event::EVT_BUTTON( $button, -1, sub { __OnClick( $self, @_ ) } );
$mainFrm->Show(1);
return $self;
}
sub OnInit {
return 1;
}
sub __OnClick {
my $self = shift;
my $btn = shift;
my $event = shift;
print $self->{"windowNumber"};
}
my $myApp = MyApp->new(1);
my $myApp2 = MyApp->new(2);
$myApp->MainLoop;
您似乎对 wxApp
和 wxFrame
之间的区别感到非常困惑。第一个代表整个应用程序,并且只能有一个(无论如何在非病态情况下)。要创建多个顶级 windows,创建多个 wxFrames
就足够了,但您的代码并没有这样做,它实际上创建了多个 wxApp
实例。
不要这样做,创建一个 wxApp
,然后根据需要创建尽可能多的 windows。