Beefy Boxes and Bandwidth Generously Provided by pair Networks
Your skill will accomplish
what the force of many cannot
 
PerlMonks  

Re: How do I destroy a control after its creation in wxPerl?

by Anonymous Monk
on May 11, 2011 at 10:25 UTC ( [id://904130]=note: print w/replies, xml ) Need Help??


in reply to How do I destroy a control after its creation in wxPerl?

like so ... But it does not seem to have any effect. Any pointers? Thanks like always.

Well :) :D ;D if your code was runnable, you'd see that it does work, How do I post a question effectively?

Proof of concept

#!/usr/bin/perl -- use Wx; # First, define an application object class to encapsulate the applica +tion itself package HelloWorld; use base 'Wx::App'; # We must override OnInit to build the window sub OnInit { my $self = shift; my $frame = Wx::Frame->new(undef, # no parent window -1, # no window id 'Hello, World!', # Window title [-1, -1], # Position [-1, -1], # Size ); my $panel = Wx::Panel->new($frame); $frame->CreateStatusBar( 2, Wx::wxSB_RAISED() ); $frame->GetStatusBar->SetStatusText("--------------humpty",0); $frame->GetStatusBar->SetStatusText("dumpty",1); $frame->GetStatusBar()->SetForegroundColour(Wx::wxRED());; my $warning = Wx::StaticText->new ($frame->GetStatusBar(), -1,"Inp +ut Error!"); Wx::Event::EVT_BUTTON( $frame, Wx::Button->new($panel, -1, "DOIT"), sub { if( $warning ){ print "$_\n" for $frame->GetStatusBar()->GetChildren; +# only child is warning $warning->Destroy(); undef $warning; } $frame->GetStatusBar->SetStatusText("OK ". time ,0); }, ); $frame->Show(1); return 1; } # Create the application object, and pass control to it. package main; my $app = HelloWorld->new; $app->MainLoop; __END__

Replies are listed 'Best First'.
Re^2: How do I destroy a control after its creation in wxPerl?
by Anonymous Monk on May 11, 2011 at 10:50 UTC
    A better test would be a simple one.
    #! /usr/bin/env perl use strict; use warnings; use Wx ':everything'; use Wx::Event ':everything'; my $window = Wx::Frame->new(undef, wxID_ANY, $0); my $panel = Wx::Panel->new($window); my $toggle = Wx::Button->new($panel, wxID_ANY, "&Toggle"); my $status = $window->CreateStatusBar(2, wxSB_RAISED); $status->SetStatusText("foo", 0); $status->SetStatusText("bar", 1); my $warning = Wx::StaticText->new($status, wxID_ANY, "warning"); $warning->SetBackgroundColour(Wx::Colour->new('yellow')); $warning->SetForegroundColour(Wx::Colour->new('red')); sub fit_warning { $warning->SetSize($status->GetFieldRect(0)) } EVT_SIZE($status, \&fit_warning); EVT_BUTTON($toggle, $toggle, sub { unless ($warning->IsShown) { $warning->SetLabel(scalar localtime); fit_warning(); $warning->Show; } else { $warning->Hide; } }); $warning->Hide; $window->Show; Wx::SimpleApp->new->MainLoop;
      A better test would be a simple one.

      Hiding makes sense, but I don't presume to know what ZJ is really after :)

Re^2: How do I destroy a control after its creation in wxPerl?
by ZJ.Mike.2009 (Scribe) on May 11, 2011 at 23:46 UTC
    Thanks Anonymous Monk, I've updated my post with code that demonstrates my problem. I seem to unable to create a control in a subroutine and then immediately destroy it if a condition is true.
      I seem to unable to create a control in a subroutine and then immediately destroy it if a condition is true.

      I assume this is a moot point by now, since the show/hide approach is best, but here it is, for posterity :)

      Your code does not attempt to do that

      Ignoring that for a minute, this is common for all GUI frameworks, when MainLoop is running, calling Destroy from a callback doesn't actually destroy a window immediately, it schedules it for destruction. See

      Now back to the code, this will show you the error
      sub button_click { $hit++; warn "hit $hit "; my $warning = Wx::StaticText->new($status, -1, "Input Error $hit " +,,[3,8]); $warning->SetForegroundColour(wxRED); if ($hit % 2) { $status->SetStatusText("", 0); $warning->Show; } else { $warning->Destroy; $status->SetStatusText("OK", 0); } warn "[\n", map({ "\t$_,\n" } $status->GetChildren ), "\] "; }
      The output is
      $ perl wx.904074.event.pl hit 2 at wx.904074.event.pl line 34. [ ] at wx.904074.event.pl line 46. hit 3 at wx.904074.event.pl line 34. [ Wx::StaticText=HASH(0xed4c34), ] at wx.904074.event.pl line 46. hit 4 at wx.904074.event.pl line 34. [ Wx::StaticText=HASH(0xed4c34), ] at wx.904074.event.pl line 46. hit 5 at wx.904074.event.pl line 34. [ Wx::StaticText=HASH(0xed4c34), Wx::StaticText=HASH(0xed4be4), ] at wx.904074.event.pl line 46. hit 6 at wx.904074.event.pl line 34. [ Wx::StaticText=HASH(0xed4c34), Wx::StaticText=HASH(0xed4be4), ] at wx.904074.event.pl line 46. hit 7 at wx.904074.event.pl line 34. [ Wx::StaticText=HASH(0xed4c34), Wx::StaticText=HASH(0xed4be4), Wx::StaticText=HASH(0xed4c44), ] at wx.904074.event.pl line 46. hit 8 at wx.904074.event.pl line 34.
      With each iteration you're creating a new statictext, but you only Destroy it every other iteration, so the list of statictext objects keeps growing.
        Anonymous Monk, thank you for your clarification. The diagnostic code is very explanatory. I'll take a look at the linked document. Thank you again.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://904130]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others romping around the Monastery: (4)
As of 2024-03-28 14:38 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found