use strict; use Tk; use Data::Dumper; my @data = (qw( ccc eee ddd aaa aaa ccc ddd ddd bbb ddd eee ggg fff)); my %seen; # Create & configure text widget... my $top = MainWindow->new; my $list = $top->Scrolled('Listbox')-> pack(-side=>'right', -fill=>'both', -expand =>1); my $ref; $ref = $top->repeat(700, \&addItem); sub addItem { my $item = shift(@data); if(!$item) { $ref->cancel; return }; print STDERR "$item\n"; # Selected items (by name) my @selected_items = map {$list->get($_)} $list->curselection; print "Selected items: @selected_items\n"; if(! $seen{$item}) { my @new_selection_order = sort keys %seen; # Map names to list position my %new_selection = map {($new_selection_order[$_] => $_)} 0..$#new_selection_order; $list->delete(0, 'end'); $list->insert('end', @new_selection_order); # Set selection(s) print "New indexes should be @new_selection{@selected_items}\n"; $list->selectionSet($_) for @new_selection{@selected_items}; } $seen{$item}++; } MainLoop();