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

Is there a widget that acts like Tk::HistEntry but allows multiple selections?

Replies are listed 'Best First'.
Re: which widget?
by lamprecht (Friar) on Mar 31, 2010 at 09:31 UTC
    Hi,

    could you be a bit more specific with your requirements? Should the combination of (multiple) selections be stored in history? Or do you need a multiple entry widget with auto updating suggestions?

    Here is an example for the latter using Tk::EntrySet. It is a bit hacky - I did not write it for a history use-case. Just type into the entry and hit return, then watch the suggestions drop-down grow:

    use strict; use warnings; use Tk; use Data::Dumper; my $mw = tkinit; my $getter = sub{ $_[0]->Subwidget('entry')->get}; my $setter = sub{my $e = $_[0]->Subwidget('entry'); $e->delete(0,'end'); $e->insert('end', $_[1]); }; my $inst = sub{$_[0]->bind('<Key-Return>' ,$_[1]); $_[0]->configure(-browsecmd => $_[1]); }; my $mbe; $mbe = $mw->EntrySet(-entryclass => 'BrowseEntry', -getter => $getter, -valuelist => [], # -entryoptions => [-choices => []], -setter => $setter, -callback_installer => $inst, -changed_command => sub{mbe_changed( $mbe )}, )->pack(-fill => 'both', -expand => 1); $mw->Button(-text => 'dump value', -command => sub{print Dumper $mbe->valuelist}, )->pack; MainLoop; { my @choices; sub mbe_changed{ my $mbe = shift; my %seen; my @valuelist = @{$mbe->valuelist}; for my $item ( @choices, @valuelist) { $seen{ $item } = 1; } @choices = sort keys %seen; my @e = (@{$mbe->{_EntrySet}{entry_pool}}, @{$mbe->{_EntrySet}{entries}}); for my $entry ( @e ) { $entry->configure(-choices => \@choices); } $mbe->valuelist(\@valuelist); } }

    Update: It should be perfectly possible to specify -entryclass => 'Tk::HistEntry' for Tk::EntrySet and sync the history of the entry instances in analogy to the example above.


    Cheers, Chris
      Thanks chris for posting this. This widget is close but doesn't do multiple selections... I may use something like this for the basis for a solution... I am kind of surprised that there isn't anything out there that does this, which is why I was sure that I had just missed it. an entry box with drop down listbox of historical entries?
        Hi,

        not sure if I get you right... Tk::EntrySet is a composite designed to enter multiple values/selections where the underlying -entryclass allows for a single value/selection only. Just make a selection (or enter a value) in the last (empty) entry, and a new field will appear. Delete contents of an entry, hit return and the entry will disappear.
        So instead of having one widget with multiple selection capability, you get a dynamically growing/shrinking set of single selection widgets. Your program will not talk to the entries but to the wrapping Tk::EntrySet instance which provides a simple API for a multiple value widget. You can always access the list of selected values with $entry_set->valuelist.

        Can you point us to an example of a widget matching your requirements (Possibly one that is implemented in another UIFramework)?


        Cheers, Chris
Re: which widget?
by Khen1950fx (Canon) on Mar 31, 2010 at 09:18 UTC
      What I want to be able to do is either enter a new value to be acted on or make selections ( sometimes multiple selections ) from previous entries... an entry widget with a button, and a listbox that drops down when the button is selected... I have a widget that uses a button to expose a listbox in a toplevel and now I need to make history entries as well as multiple selections. HLists won't work. thank you for taking the time and lending your expertise.