in reply to which widget?

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

Replies are listed 'Best First'.
Re^2: which widget?
by liamlrb (Acolyte) on Apr 02, 2010 at 01:35 UTC
    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
        I appreciate your taking the time. I learned something new with this approach and put the code in my snippets. But this widget will be used in a form and growing set of widgets will mess the whole form up. I need something more like a an browseentry box with drop down listbox functionality that acts as a drop down menu ). I use a button with a listbox in a toplevel which I pop under on demand for a different form widget and think I might impliment something like that for this but use a entry widget of some sort. thanks