in reply to Getting segfaults when destroying and recreating Tk box
NEVER write scripts that try to create-destroy-create a MainWindow. The MainWindow in Tk IS the eventloop. The eventloop MUST continue to run for proper operation, and trying to destroy it, with some code saying "restart yourself at death" is not going to be reliable.
The way you approach your type of script, is to make one mainwindow,and then some "toplevel" windows to present information. You can destroy a toplevel window, without it affecting the mainwindow's eventloop; but repeated create/destroy cycles of a toplevel window, may cause a memory gain, so you should always design scripts to reuse windows...... don't destroy them, just withdraw them, then repack them with different widgets.
Here is a way to use your code .
#!/usr/bin/perl -w use Tk; use strict; my $MW; my $Array_Index=""; my @Widget_List; my $my_ref; my @file_references ; my $i; $MW = MainWindow->new; push @Widget_List, $MW->title("test box 1"); push @Widget_List, $MW->Label(-text=>"Choose one option", -font=>"courierfont") -> pack; @file_references = ("Ref1", "Ref2", "Ref3", "Ref4"); $i=1; foreach $my_ref (@file_references) { push @Widget_List, $MW->Button(-text => "$my_ref", -command => [ \&do_button, "$my_ref,$i"]) -> pack; $i++; } MainLoop(); sub do_button { my $params; my $widget; $params = shift; (my $ref, $Array_Index) = split (/,/,$params); print "$params\n"; $MW->Label(-text=>"This line will not cause a segfault")->pack; foreach $widget (@Widget_List) { $widget->destroy(); } $MW->Button(-text => "Shutdown and close", -command => [ \&abort_routine]) -> pack; } sub abort_routine{ exit }
and a better way to do it
#!/usr/bin/perl use warnings; use strict; use Tk; my $MW = MainWindow->new; $MW->withdraw; $MW->Label(-text=>"This line will not cause a segfault")->pack; $MW->Button(-text => "Shutdown and close", -command => [ \&abort_routine]) -> pack; my $top = $MW->Toplevel(-bg=>'steelblue',-title=>"test box 1"); $top->Label(-text=>"Choose one option", -font=>"courierfont") -> pack; my @file_references = ("Ref1", "Ref2", "Ref3", "Ref4"); my $i=1; foreach my $my_ref (@file_references) { $top->Button(-text => "$my_ref", -command => [ \&do_button, "$my_ref,$i"]) -> pack; $i++; } MainLoop(); sub do_button { my $params; my $widget; $params = shift; (my $ref, my $Array_Index) = split (/,/,$params); print "$params\n"; $top->destroy(); $MW->deiconify; $MW->raise; } sub abort_routine{ exit }
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: Getting segfaults when destroying and recreating Tk box
by skt (Initiate) on Sep 06, 2007 at 01:00 UTC | |
by zentara (Cardinal) on Sep 06, 2007 at 10:43 UTC |