I've been using wxGlade to create wxPerl interfaces.
This is a sample of how to get one subroutine to handle multiple keys. Clicking any key allows the subroutine to return the label text of which key has been pressed.
Pressing a key will give a Wx::MessageBox
I haven't yet figured out how to return the actual control name (e.g. button_1 , button_2 etc). Sigh.
Update:
Some information from the wxPerl mailing list you can, instead of leaving the default wxGlade -1 value for the key id and letting wxPerl generate it's semi random keyid's, define your own.
That way when you call ->GetId you can test against a predictable value
#define key ID's
my ($KEY1, $KEY2, $KEY3, $KEY4, $KEY5, $KEY6, $KEY7, $KEY8, $KEY9) = (1, 2, 3, 4, 5, 6, 7, 8, 9);
# update the button creation with the new button ID constants
$self->{button_1} = Wx::Button->new($self, $KEY1, "1");
$self->{button_2} = Wx::Button->new($self, $KEY2, "2");
$self->{button_3} = Wx::Button->new($self, $KEY3, "3");
$self->{button_4} = Wx::Button->new($self, $KEY4, "4");
$self->{button_5} = Wx::Button->new($self, $KEY5, "5");
$self->{button_6} = Wx::Button->new($self, $KEY6, "6");
$self->{button_7} = Wx::Button->new($self, $KEY7, "7");
$self->{button_8} = Wx::Button->new($self, $KEY8, "8");
$self->{button_9} = Wx::Button->new($self, $KEY9, "9");
# you would then put this kind of code in the keyPress event handler sub
if ($KEY1 == $event->GetEventObject()->GetId() ) {
# do blah
}
#!/usr/bin/perl -w --
# generated by wxGlade 0.6.3 on Fri Aug 14 14:57:39 2009
# To get wxPerl visit http://wxPerl.sourceforge.net/
use Wx 0.15 qw[:allclasses];
use strict;
package MyFrame;
use Wx qw[:everything];
use base qw(Wx::Frame);
use strict;
sub new {
my( $self, $parent, $id, $title, $pos, $size, $style, $name ) = @_;
$parent = undef unless defined $parent;
$id = -1 unless defined $id;
$title = "" unless defined $title;
$pos = wxDefaultPosition unless defined $pos;
$size = wxDefaultSize unless defined $size;
$name = "" unless defined $name;
# begin wxGlade: MyFrame::new
$style = wxDEFAULT_FRAME_STYLE
unless defined $style;
$self = $self->SUPER::new( $parent, $id, $title, $pos, $size, $style, $name );
$self->{button_1} = Wx::Button->new($self, -1, "1");
$self->{button_2} = Wx::Button->new($self, -1, "2");
$self->{button_3} = Wx::Button->new($self, -1, "3");
$self->{button_4} = Wx::Button->new($self, -1, "4");
$self->{button_5} = Wx::Button->new($self, -1, "5");
$self->{button_6} = Wx::Button->new($self, -1, "6");
$self->{button_7} = Wx::Button->new($self, -1, "7");
$self->{button_8} = Wx::Button->new($self, -1, "8");
$self->{button_9} = Wx::Button->new($self, -1, "9");
$self->__set_properties();
$self->__do_layout();
Wx::Event::EVT_BUTTON($self, $self->{button_1}->GetId, \&keyPress);
Wx::Event::EVT_BUTTON($self, $self->{button_2}->GetId, \&keyPress);
Wx::Event::EVT_BUTTON($self, $self->{button_3}->GetId, \&keyPress);
Wx::Event::EVT_BUTTON($self, $self->{button_4}->GetId, \&keyPress);
Wx::Event::EVT_BUTTON($self, $self->{button_5}->GetId, \&keyPress);
Wx::Event::EVT_BUTTON($self, $self->{button_6}->GetId, \&keyPress);
Wx::Event::EVT_BUTTON($self, $self->{button_7}->GetId, \&keyPress);
Wx::Event::EVT_BUTTON($self, $self->{button_8}->GetId, \&keyPress);
Wx::Event::EVT_BUTTON($self, $self->{button_9}->GetId, \&keyPress);
# end wxGlade
return $self;
}
sub __set_properties {
my $self = shift;
# begin wxGlade: MyFrame::__set_properties
$self->SetTitle("A sample keypad program");
# end wxGlade
}
sub __do_layout {
my $self = shift;
# begin wxGlade: MyFrame::__do_layout
$self->{sizer_1} = Wx::BoxSizer->new(wxVERTICAL);
$self->{grid_sizer_1} = Wx::GridSizer->new(3, 3, 0, 0);
$self->{grid_sizer_1}->Add($self->{button_1}, 0, 0, 0);
$self->{grid_sizer_1}->Add($self->{button_2}, 0, 0, 0);
$self->{grid_sizer_1}->Add($self->{button_3}, 0, 0, 0);
$self->{grid_sizer_1}->Add($self->{button_4}, 0, 0, 0);
$self->{grid_sizer_1}->Add($self->{button_5}, 0, 0, 0);
$self->{grid_sizer_1}->Add($self->{button_6}, 0, 0, 0);
$self->{grid_sizer_1}->Add($self->{button_7}, 0, 0, 0);
$self->{grid_sizer_1}->Add($self->{button_8}, 0, 0, 0);
$self->{grid_sizer_1}->Add($self->{button_9}, 0, 0, 0);
$self->{sizer_1}->Add($self->{grid_sizer_1}, 1, wxEXPAND, 0);
$self->SetSizer($self->{sizer_1});
$self->{sizer_1}->Fit($self);
$self->Layout();
# end wxGlade
}
sub keyPress {
my ($self, $event) = @_;
# wxGlade: MyFrame::keyPress
warn "Event handler (keyPress) not implemented";
$event->Skip;
# end wxGlade
# this is the key to getting which button is clicked
my $key = $event->GetEventObject()->GetLabel();
my $keyid = $event->GetEventObject()->GetId();
Wx::MessageBox("You pressed: $key\nKey ID: $keyid", "wxPerl Sample", wxICON_INFORMATION );
}
# end of class MyFrame
1;
1;
package main;
unless(caller){
local *Wx::App::OnInit = sub{1};
my $app = Wx::App->new();
Wx::InitAllImageHandlers();
my $frame_1 = MyFrame->new();
$app->SetTopWindow($frame_1);
$frame_1->Show(1);
$app->MainLoop();
}
0 Comments