in reply to opening multiple sub-windows in perl tk

Here's two ways you can stop the button from being repeatedly invoked:

  1. Check if the Toplevel already exists.
  2. Use a local grab.

Checking for existence:

use strict; use warnings; use Tk; my $mw = MainWindow->new(); my $single_tl; $mw->Button(-text => 'Open Toplevel', -command => sub { if (Exists($single_tl)) { $mw->messageBox(-message => 'Already Open'); } else { $single_tl = $mw->Toplevel(); $single_tl->Button(-text => 'Close', -command => sub { $single_tl->destroy(); }, )->pack(); } }, )->pack(); $mw->Button(-text => 'Exit', -command => sub { exit })->pack(); MainLoop;

Using a grab:

use strict; use warnings; use Tk; my $mw = MainWindow->new(); $mw->Button(-text => 'Open Toplevel', -command => sub { my $single_tl = $mw->Toplevel(); $single_tl->Button(-text => 'Close', -command => sub { $single_tl->destroy(); }, )->pack(); $single_tl->grab(); }, )->pack(); $mw->Button(-text => 'Exit', -command => sub { exit })->pack(); MainLoop;

Please note that both of these pieces of code are self-contained, will run without requiring further code and are not cluttered with irrelevant, cosmetic instructions (e.g. changing colours, resizing windows and so on). Please read How do I post a question effectively? paying particular attention to "... a minimal script that reproduces your problem ..."

Furthermore, your zig-zag indentation is not particularly easy to ready. Please choose an indentation style and use it. perlstyle may help you with this.

You've received help on quite a few questions you've posted in recent weeks. Consider helping those who are helping you.

-- Ken