in reply to perl/tk: text output from tail function

Your code is hard to read withall the regexes and everything, but this section is a real mess with Tk's eventloop,
while (1) { ($nfound,$timeleft,@pending)= File::Tail::select(undef,und +ef,undef,$timeout,@files); unless ($nfound) { print "Nothing to print \n"; } else { foreach(@pending)
You should use Tk's internal fileevent to watch tail's output, and never use while(1) loops in an eventloop system, like Tk.

Here are a couple of Tk file tailing examples

#!/usr/bin/perl use strict; use Tk; use IO::Handle; my $H=IO::Handle->new; open($H,"tail -f -n 50 z.txt |") or die $!; my $main = MainWindow->new; my $t = $main-> Scrolled('Text', -wrap=>'none')->pack(-expand=>1); $main->fileevent(\*$H,'readable',[\&fill,$t]); MainLoop; sub fill { my ($w) = @_; my $text; my $text =<$H>; $w->insert('end',$text); $w->yview('end'); }

or

#!/usr/bin/perl # tktail pathname use warnings; use strict; use Tk; my $pid = open(H, "tail -f -n 25 $ARGV[0]|") or die ; my $mw = MainWindow->new; my $t = $mw->Text(-width => 80, -height => 25, -wrap => 'none'); $t->pack(-expand => 1); $mw->fileevent('H', 'readable', [\&fill_text_widget, $t]); $mw->OnDestroy(\&quitCB); MainLoop; sub fill_text_widget { my($widget) = @_; my $text = <H>; $widget->insert('end', $text); $widget->yview('end'); } # end fill_text_widget sub quitCB { kill 9,$pid or die $!; exit; }

I'm not really a human, but I play one on earth.
Old Perl Programmer Haiku ................... flash japh

Replies are listed 'Best First'.
Re^2: perl/tk: text output from tail function
by terrance (Initiate) on Apr 05, 2011 at 17:28 UTC
    I think your example only able read a single file in a time rite?But unable to read multi-file.
      I think your example only able read a single file in a time rite?But unable to read multi-file.

      Right. But, duh, how hard is it to to open several files for tail? I just showed you how to do one. There is no limit to how many fileevents you can setup, to watch as many files as you want. You THEN can write the output in different colors to the same text box, OR you can have each write to their own textbox.

      If you want automatic updates, setup Tk::repeat timers to refresh your text boxes with new tail output. Its all very straight forward, but a bit too big for me just to whip out off hand.

      C'mon.... you can do it... ;-)

      It's a sunny day, and I'm not a script writing service, unless you are a check-writing service :-)


      I'm not really a human, but I play one on earth.
      Old Perl Programmer Haiku ................... flash japh