Use the line of code below, and the first arg(s) to sub Entry will be the passed in sub value. Here is an example for accepting only ints of a certain length (which I just typed in, so may have a typo ;) ):
sub short_int_ok { my $res = (shift =~ /^(\d{0,5})$/); return ($res ? 1 : 0); } On 2011-01-10, at 11:25 PM, David Swingle wrote: > Thanks Jeff. I have no idea what a Tkx::Ev event is. Is there an example > that uses -validatecommand as you describe? > > On Mon, Jan 10, 2011 at 5:13 PM, Jeff Hobbs <je...@activestate.com> wrote: > Hi David, > > On 2011-01-07, at 9:42 PM, David Swingle wrote: > > I have a simple Perl/Tkx script: > > > > use strict; > > use Tkx; > > Tkx::package_require("tile"); > > Tkx::package_require("style"); > > > > my $mw = Tkx::widget->new("."); > > my $text = "abc"; > > my $entry = $mw->new_ttk__entry(-width => 20, -textvariable => \$text); > > $entry->configure(-font => "helvetica 14 bold"); > > $entry->g_grid(-column => 0, -row => 0, -sticky => 'w'); > > $entry->configure(-validate => 'all', -validatecommand => \&Entry); > > > > Tkx::MainLoop(); > > > > sub Entry > > { > > print "Entry: '$text'\n"; > > return 1; > > } > > > > When I run the script, the GUI is displayed and I have "abc" in the entry > > widget. I then click in the widget at the end of the text, and then type > > '1', '2', '3'. I get the following output: > > > > Entry: 'abc' > > Entry: 'abc' > > Entry: 'abc1' > > Entry: 'abc12' > > > > The first line prints as soon as I click in the entry widget, and the 2nd > > line prints when I type '1', and so on. What do I need to do so that my > > output is "abc1" after I type the '1', and "abc12" after I type the '2', and > > so on? > > You are getting this effect because the validation occurs _before_ the actual > change occurs. You want to create a Tkx::Ev bound event, e.g.: > > -validatecommand => [\&Entry, Tkx::Ev('%P')], > > Check the docs in ttk::entry for all the right %-subs that would give you > what you want for best validation. > http://www.tcl.tk/man/tcl/TkCmd/ttk_entry.htm#M40 > > Jeff >