http://www.perlmonks.org?node_id=680170


in reply to Re: Perl/Tk Oddities
in thread Perl/Tk Oddities

Here is an attempt I have made to achieve the concept of modal dialog box with the Dialog widget. I'm also using an icon in the upper left. It's a simple icon I found that some software had installed.
#!perl # file form_dialog.pl =begin comment This is a demo to show how to create a Perl/Tk modal dialog box runnin +g from a button entry. This also uses the form layout/geometry manager. Note that a few widget are positioned relative to the center of the di +alog box by computing the required width of the widget and then by taking h +alf of the widget and using that half-width to offset from the center of t +he dialog. If using the -left parameter for placement, the left edge of a + widget will be to the right of that point. Therefore, it is necessary to shif +t a widget to the left of the center ('%50') by half of its width in order + to give it the correct placement. The same can be done for vertical cente +ring. =cut use Tk ; use strict ; use warnings ; use Tk::Dialog ; use Tk::Button ; ###################################################################### my $message = 'nothing yet ...' ; my $w ; #used for horizontal placement of widgets relative to form ce +nter ###################################################################### my $mw = MainWindow->new ; $mw->title('Opens a dialog box from button' ) ; $mw->geometry( "250x100" ) ; $mw->toplevel->iconbitmap( 'Status4.ico' ) ; my $input = $mw->Button( -text => 'Press to input data!', -command => \&demoDialog, -padx => 5 ) ; $w = -( $input->reqwidth()/2 ) ; #here's how to center a button $input->form( -top => '%10', -left => [ '%50', $w ] ) ; my $label = $mw->Label( -textvariable => \$message ) ; $label->form( -top => [ $input, 10 ], -left => '%10' ) ; my $exit = $mw->Button( -text => 'Exit', -command => [$mw => 'destroy'] ) ; $w = -( $exit->reqwidth()/2 ) ; #here's how to center a button $exit->form( -bottom => [ '%95' ], -left => [ '%50', $w ] ) ; ###################################################################### MainLoop ; ###################################################################### sub demoDialog { #must use -buttons, otherwise an 'Ok' is automatically included in + the # dialog box #note that there appears to be no way to position these buttons at + the # bottom of a dialog box in the 'form' sense. They appear to be # amaturishly close to the bottom edge! my $dialog = $mw->Dialog( -bitmap => 'question', -title => 'Demo of Form-based Dialog', -default_button => 'Yes', -buttons => [ qw/Yes No Cancel/ ] ) ; $dialog->geometry( "450x200" ) ; my $txt = $dialog->add( 'Label', -text => "Yabba, Dabba" ) ; $txt->configure( -font => [ -family => 'Courier', -size => 16, -weight => 'bold', ] ); $w = -( $txt->reqwidth()/2 ) ; #here's how to center a widget $txt->form( -bottom => '%50', -left => [ '%50', $w ] #the $w value is negative, so it moves to + left of center ) ; my $lab = $dialog->add( 'Label', -text => "label text" ) ; $lab->form( #this is a label that is right justified -top => '%10', -right => '%90' ) ; my $textent = undef ; my $ent = $dialog->add( 'Entry', -textvariable => \$textent ) ; $ent->form( #a text entry positioned relative to the right edge of t +he label -top => $lab, -right => [ '&', $lab ] ) ; my $bttn = $dialog->add( 'Button', -text => "important stuff", -padx => 5, -command => \&helper ) ; $w = -( $bttn->reqwidth()/2 ) ; #here's how to center a button $bttn->form( -bottom => '%90', -left => [ '%50', $w ] ) ; my $answer = $dialog->Show( ) ; if( ! defined( $textent ) ) { $textent = "nada" ; } $message = qq{You pressed '$answer' and answered '$textent' } ; } sub helper { print "get help\n" ; }