Hi James, I totally agree with you. I'm also failing to grasp this. If Anyone can point me to some documentation that would be great.
However on the Glade code, while I wrote my whole prototype In Glade, and I wouldn't have progressed as fast as I have without it, I don't like its programmatic structure. It seems to scan for items and create them. Scan for properties, create them, scan for sizer info and create it. The first thing I do is get rid of "do layout" and "do properties" and group like lines so that similar items are together. This makes the code much more maintainable. So with your sample code, I get: # my sample application #!/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->{sizer_1} = Wx::BoxSizer->new(wxVERTICAL); $self->{grid_sizer_1} = Wx::GridSizer->new(3, 3, 0, 0); for (my $i=1; $i<=9;$i++){ $self->{"button_".$i} = Wx::Button->new($self, -1, $i); Wx::Event::EVT_BUTTON($self, $self->{"button_".$i}->GetId, \&keyPress); $self->{grid_sizer_1}->Add($self->{"button_".$i}, 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(); $self->SetTitle("A sample keypad program"); return $self; } sub keyPress { my ($self, $event) = @_; # wxGlade: MyFrame::keyPress <event_handler> warn "Event handler (keyPress) not implemented"; $event->Skip; my $key = $event->GetEventObject()->GetLabel(); my $keyid = $event->GetEventObject()->GetId(); # end wxGlade Wx::MessageBox("You pressed: $key\nKey ID: $keyid", "wxPerl Sample"); } # end of class MyFrame 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(); } Regards Steve -----Original Message----- From: GMAIL - James McDonald [mailto:ja...@jamesmcdonald.id.au] Sent: 14 August 2009 02:39 To: wxperl-users@perl.org Subject: wxGlade Generated Code I use wxPerl to create custom interfaces. Alot of these interfaces have a Number Keypad and I've only just figured out how to get hold of the actual object I click using a post from Steve Cookson (Thanks Steve). It's embarrassing to admit but I was creating one event handler per key ( keyPress1, keyPress2 etc...) So using: my $keyLabel = $event->GetEventObject()->GetLabel(); I can get the text on the button I have clicked. But let's say I want to know the actual control name such as return "button_1" from the EVT_BUTTON event how do I return that? I can use GetId to return the default number but how do I return it's programmatic name? $self->{grid_sizer_1}->Add($self->{button_1}, 0, 0, 0); I am not really understanding the event subsystem very well. Of course I have looked at the documentation but due to my lack of understanding I still am not grasping the concept. I have little idea of what $event->Skip means and where in the block it should appear, if at all. Can anyone enlighten me? What does the doco it mean when it says you can have "further event handlers", can you create a chain of event handlers? # copy and paste from docs wxEvent::Skip *void* *Skip*(*bool*/ skip = true/) This method can be used inside an event handler to control whether further event handlers bound to this event will be called after the current one returns. Without Skip() (or equivalently if Skip(false) is used), the event will not be processed any more. If Skip(true) is called, the event processing system continues searching for a further handler function for this event, even though it has been processed already in the current handler. In general, it is recommended to skip all non-command events to allow the default handling to take place. The command events are, however, normally not skipped as usually a single command such as a button click or menu item selection must only be processed by one handler. # my sample application #!/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 <event_handler> warn "Event handler (keyPress) not implemented"; $event->Skip; my $key = $event->GetEventObject()->GetLabel(); my $keyid = $event->GetEventObject()->GetId(); # end wxGlade Wx::MessageBox("You pressed: $key\nKey ID: $keyid", "wxPerl Sample"); } # 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(); }