in reply to Question on Tk Entry

Let me make one amendment to my query.

I was just checking the Perl/Tk FAQ and there is an example there close to what I want to do, but I don't want to have the user click a button to get their input in to my variable and there seems to be no -command or similar for Entry to run a subroutine, so now I'm really stumped...

Replies are listed 'Best First'.
Re: Re: Question on Tk Entry
by grummerX (Pilgrim) on Apr 22, 2002 at 10:15 UTC
    You're on the right track here. The -textvariable is getting assigned by Tk any time the user interacts with your Entry widget, but you just need to decide how and when you want to access that variable. If I understand correctly, you'd like to get at it when the user leaves the field rather than having the user click a button. In this case, you should use the -validatecommand option, which can essentially act as the -command option you were using on the button. This is similar to the binding approach that graff mentions, but it will trigger any time the Entry widget loses focus, not just when the user hits enter. Give this a whirl:
    #!c:/perl/bin/perl -w use strict; use Tk; my $regex = ''; my $foo = ''; my $main=MainWindow->new(); $main->Entry( -width => 20, -textvariable => \$regex, -validate => 'focusout', -validatecommand => sub{ print "Regex: $regex\n" }, )->pack(); $main->Entry( -width => 20, -textvariable => \$foo, -validate => 'focusout', -validatecommand => sub{ print "Foo: $foo\n" }, )->pack(); MainLoop;

    -- grummerX

Re: Re: Question on Tk Entry
by graff (Chancellor) on Apr 22, 2002 at 04:32 UTC
    Oh, well that's something different. So, is it okay for you if the user hits the "return" key (aka "Enter") to indicate that the string in the Entry is now finished? (The user will probably have to do something to signal that their done typing.) In that case, try adding this somewhere in your code after declaring the Entry widgets:

    $top->bind( 'Tk::Entry', '<Enter>', \&your_subroutine );

    I suppose if you wanted the subroutine to be triggered on every keystroke, so you could see each key as it's typed, you could try:

    $top->bind( 'Tk::Entry', '<KeyRelease>', [\&subroutine, Ev('K')] );

    In this case, the subroutine gets the keystroke value as the second argument (first arg is the reference to the entry widget that got the event).

      That looks a bit more like what I was after originally, but I think I'm going to stick with the button as there is no guarentee that the user would actually hit the enter key and not just move on.