#!/usr/bin/perl use warnings; use strict; use Tk; my $mw = MainWindow->new; $mw->title( "MainWindow" ); $mw->geometry('400x400+30+30'); $mw->Button( -text => "Toplevel", -command => \&do_Toplevel )->pack(); $mw->waitVisibility; my $tl; &do_Toplevel; #initialize it in withdrawn state MainLoop; sub do_Toplevel { my $topx = 300; my $topy = 100; # print $mw->geometry,"\n"; my ($xs,$ys,$signx,$xp,$signy,$yp) = $mw->geometry =~ /(\d+)x(\d+)([+-]+)(\d+)([+-]+)(\d+)/; # print "$xs,$ys,$signx,$xp,$signy,$yp\n"; my $xpos = int($xp + $xs/2 - $topx/2); my $ypos = int($yp + $ys/2 - $topy/2); if ( !Exists( $tl ) ) { $tl = $mw->Toplevel(); $tl->geometry($topx.'x'.$topy.'+'.$xpos.'+'.$ypos); $tl->title( "Toplevel" ); #put all your widgets here $tl->Button( -text => "Close", -command => sub { $tl->grabRelease; $tl->withdraw } )->pack; $tl->withdraw; } else { $tl->geometry($topx.'x'.$topy.'+'.$xpos.'+'.$ypos); $tl->deiconify(); $tl->raise(); $tl->grabGlobal; } } ##############################################################