in reply to TK Toplevel Window List

The following script will output a list of MainWindows and all (immediate) children for every instance that is running.

#!/usr/bin/env perl -T use strict; use warnings; use Tk; $ENV{HOME} =~ /^(.*)$/; $ENV{HOME} = $1; my $widget_list_joiner = '~'; my $mw = MainWindow->new(-title => 'Toplevel Lister'); $mw->geometry('400x300+50+50'); my $tl = $mw->Toplevel; $tl->Button(-text => 'Close', -command => sub { $tl->withdraw })->pack +; $tl->raise; my $action_F = $mw->Frame()->pack(-side => 'bottom'); my $exit_B = $action_F->Button(-text => 'Exit', -command => sub { exit + })->pack; my $output_F = $mw->Frame()->pack; my $info_T = $output_F->Scrolled('Text', -scrollbars => 'osoe')->pack; $info_T->insert(end => '$mw->name : ' . $mw->name . "\n"); my @interps = $mw->interps; $info_T->insert(end => '$mw->interps : ' . "\n"); for (sort @interps) { $info_T->insert(end => "\t$_\n"); $info_T->insert(end => "\tToplevels:\n"); my $toplevel_list = $mw->send($_ => undef); for (split $widget_list_joiner => $toplevel_list) { $info_T->insert(end => "\t\t$_\n"); } } MainLoop; sub Tk::Receive { my $mw = shift; return join $widget_list_joiner => $mw, $mw->children; }

On the first run, the output looks like:

$mw->name : pm_tk_top_list $mw->interps : pm_tk_top_list Toplevels: MainWindow=HASH(0x7fecba93def0) Tk::Toplevel=HASH(0x7fecba9493b0) Tk::Frame=HASH(0x7fecba9a3900) Tk::Frame=HASH(0x7fecba9a3180)

With 3 instances running:

$mw->name : pm_tk_top_list #3 $mw->interps : pm_tk_top_list Toplevels: MainWindow=HASH(0x7fecba93def0) Tk::Toplevel=HASH(0x7fecba9493b0) Tk::Frame=HASH(0x7fecba9a3900) Tk::Frame=HASH(0x7fecba9a3180) pm_tk_top_list #2 Toplevels: MainWindow=HASH(0x7f87a113df20) Tk::Toplevel=HASH(0x7f87a11493b0) Tk::Frame=HASH(0x7f87a11a3900) Tk::Frame=HASH(0x7f87a11a3180) pm_tk_top_list #3 Toplevels: MainWindow=HASH(0x7fbb3093df50) Tk::Toplevel=HASH(0x7fbb309493b0) Tk::Frame=HASH(0x7fbb309a3900) Tk::Frame=HASH(0x7fbb309a3180)

References:

-- Ken

Replies are listed 'Best First'.
Re^2: TK Toplevel Window List
by Anonymous Monk on Feb 12, 2013 at 20:44 UTC
    Thanks! The ...->interps ... works great on the Linux side with X11. Thought maybe there was a data structure in the Perl interpreter which could be queried for all of the windows so it was OS independent. Sounds like not. Appreciate all of the help!!! Thanks!

      Finally was able to retrieve the window list from Perl

      Win32 using some ugly code:<\p>

      if ($^O eq "MSWin32") { my @pt = `tasklist /v`; # Get the process list from Windows (NT, 2 +K, XP, 7) foreach my $p (@pt) # One process per line { if ($p =~ m/perl\.exe/ig) # Keep only the Perl processes { my @p2 = split(/\s+/, $p, 11); # Any space after 11 is par +t of the window title my $nm = $p2[10]; $nm =~ s/\s+$//g; # Remove trailing whitespace ... } } } else { # Use interps approach }

      Thanks again for the great inputs!

        Ay carumba, so you're not gonna search Tk::Wm documentation for list?