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

I'm trying to produce an input box which can be used to get input in simple programs. I have coded this but I need to know how to close the window and return to the calling program with the value

package PARAMIN; use strict; use Tk; sub inputWindow{ my $result = $_[0]; my $mw = MainWindow->new(-title=>"Parameter Input"); my $in = $mw->Entry(-textvariable=>$result)->pack(); my $submit = $mw->Button(-text=>"Enter", -command=>sub{})->pack(); MainLoop; } 1; package RESULT; sub TIESCALAR{ my $class = shift; my $state;#= 0; #print "IN TIE\n"; return bless \$state, $class; } sub FETCH{ my $self = shift; return $$self; } sub STORE{ my $self = shift; $$self = shift; #print "IN STORE\n"; } 1;

And this calling program

use PARAMIN; tie $result, 'RESULT'; &PARAMIN::inputWindow(\$result); print $result;

Am I in the right area or is this complete rubbish. I get a value in result when I close the window

Replies are listed 'Best First'.
Re: Tk input box
by EdwardG (Vicar) on Sep 17, 2004 at 13:11 UTC

    Here's another way, perhaps simpler, depending.

    I use this to ask for input via a GUI widget, useful when I'm working outside the console on Win32.

    use strict; use warnings; use Tk; my $enteredvalue; my $window = MainWindow->new(-title => 'myTitle'); my $entry = $window->Entry(-textvariable => \$enteredvalue)->pack; $entry->bind('<Return>', \&go ); $entry->focus; MainLoop; ### sub go { # Do your thing... }

     

      If you want to close the main window, in &go, just call $mw->destroy();. I do not however know of any way to stop MainLoop after it has started other than to exit the program all together.

      May the Force be with you
        $mw->destroy() stops MainLoop.
Re: Tk input box
by EdwardG (Vicar) on Sep 17, 2004 at 13:49 UTC

    Here's a full example that makes use of Tk::DialogBox.

    use strict; use warnings; use Tk; use Tk::DialogBox; my $main = MainWindow->new(); my $popup = $main->DialogBox( -title => "myTitle", -buttons => ["ok", "cancel"] ); my $entry = $popup->add("Entry", -width => 40)->pack(); $main->Button( -text => "Pop!", -command => \&pop)->pack(); MainLoop; ### sub pop { my $finished; while (!$finished) { my $whichbutton = $popup->Show; if ($whichbutton eq "ok") { # do something $finished = 1; print $entry->get; # you might be interested in this } elsif ($whichbutton eq "cancel") { # do something else $finished = 1; } else { # not finished } } }

     

Re: Tk input box
by Scarborough (Hermit) on Sep 17, 2004 at 14:52 UTC
    Thanks for the help above and I've done it like this,
    package PARAMIN; use strict; use Tk; our (@ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS, $VERSION); require Exporter; $VERSION = 1.00; @ISA = qw(Exporter); @EXPORT = qw(inputWindow); @EXPORT_OK = qw(); sub inputWindow{ my $result = $_[0]; my $prompt = $_[1]; my $mw = MainWindow->new(-title=>"Parameter Input"); my $label = $mw->Label(-text=>$prompt)->pack(); my $in = $mw->Entry(-textvariable=>$result, -width=>30)->pack(); $in->bind('<Return>', sub{$mw->destroy} ); $in->focus; MainLoop; } 1; package RESULT; sub TIESCALAR{ my $class = shift; my $state;#= 0; #print "IN TIE\n"; return bless \$state, $class; } sub FETCH{ my $self = shift; return $$self; } sub STORE{ my $self = shift; $$self = shift; #print "IN STORE\n"; } 1;
    Called in the same way as the original post.

    Eighty percent of success is turning up - Woody Allen