Well your last script version dosn't segfault for me on linux, but I must tell you that you are thinking about Tk-programming the wrong way, and it is biting you. Why? You are destroying the mainloop, then trying to recreate it before it is destroyed. This is asking for weird problems with system timing, etc, and produces unpredictable results.

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 }

I'm not really a human, but I play one on earth. Cogito ergo sum a bum

In reply to Re: Getting segfaults when destroying and recreating Tk box by zentara
in thread Getting segfaults when destroying and recreating Tk box by skt

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.