in reply to Processing STDOUT of a called perl script during execution
While your main program is executing sub count the Tk MainLoop doesn't get control, so it can't update the text box. With the $text_box->insert() calls you are enqueuing events which don't get handled until after the sub is finished, and the main loop has control again.
Two solutions - 1.) use Tk::fileevent, 2.) call the Tk event loop yourself.
Ad 1:
$start-> configure (-text => "Start", -command => [\&count]); MainLoop(); { my $handle; sub count { if ($handle) { # get rid of previous file-event amd -handle $handle->DESTROY; undef *README; } open(README, "./test3.pl |") or die "Can't run program: $!\n"; $handle = $text_box->fileevent( \*README, 'readable', sub { my $line = <README>; if($line =~ /aaa/) { close README; wait; # reap child } $text_box -> insert ("end", $line); } ); } }
Ad 2: for calling the event loop yourself, see Re: Do I need threading for my GUI?
Note that for both solutions, you have to turn autoflush on in your external script, since output will be block buffered if you don't do so:
#!/usr/bin/perl -w $| = 1; # make line buffered print "Write something: \n"; while (<>) { print; if ($_ =~ /aaa/){ exit; } }
--shmem
_($_=" "x(1<<5)."?\n".q·/)Oo. G°\ /
/\_¯/(q /
---------------------------- \__(m.====·.(_("always off the crowd"))."·
");sub _{s./.($e="'Itrs `mnsgdq Gdbj O`qkdq")=~y/"-y/#-z/;$e.e && print}
|
|---|