fanticla has asked for the wisdom of the Perl Monks concerning the following question:

Dear Monks,

I have a text widget I use to display a long text. I'm trying to mark (with tags) ALL occurences of a simple word... without success.

I'm using the "search" option:

my $text = $frame2->Scrolled('Text',-font=>"courier 10", -scrollbars=> + 'ose', -height=> 40,-width=>80, -background =>'SystemWindow',-relief => 'flat', -wrap=>'word')->pack(-side=>'top', + -expand => 'x',-fill => 'both'); open(FILE,$filename) or die "Can't open file $filename\n"; @lines = <FILE>; $text->insert("end", "@lines"); close FILE; #tag definition $text->tagConfigure('color', -foreground =>"red",-font => "Courier $fo +nt_kwic bold"); #search $result = $text->search(-nocase => "$word_search", '1.0'); #adding tag $text->tagAdd('color', "$result wordstart", "$result wordend");

Of course I get only the first item tagged with colour. Any idea?

Thanks! Cla

Replies are listed 'Best First'.
Re: selecting all occurences in tk::text
by thundergnat (Deacon) on May 26, 2010 at 19:31 UTC

    Just search in a loop adding the highlighting as you go. Something like this: (untested)

    my $index = '1.0'; while (my $result = $text->search(-nocase => "$word_search", $index, ' +end')){ $text->tagAdd('color', "$result wordstart", "$result wordend") $index = "$result wordend"; }

    If it is a large file, it may take a while to churn through; you may want to update your main window inside the loop so it doesn't "lock-up" while its working. This will add extra time to the process however.

      I found that I can select all istances at a time with FindAll. According to the manual, all matches are tagged with the sel tag. But how can I add the tag "color" to all matches?

      #formatting $text->tagConfigure('color', -foreground =>"red",-font => "Courier $fo +nt_kwic bold"); #search $text->FindAll(-exact, -nocase, $word_search); #Need here to tag all matches

      Thanks

        Hi,
        use Tk; my $mw = tkinit; my $t = $mw->Text()->pack; $t->tagConfigure('foo', -background => 'yellow'); $t->insert('end',"foo\nbar\nbaz\nfoo\n"); $t->FindAll(qw/-exact -case foo/); $t->tagAdd('foo',$t->tagRanges('sel')); MainLoop;

        See the tagRanges() and tagAdd() methods documented in Tk::Text

        Cheers, Christoph
        update: Added example