Beefy Boxes and Bandwidth Generously Provided by pair Networks
Think about Loose Coupling
 
PerlMonks  

Re: TK Toplevel Window List

by kcott (Abbot)
on Feb 12, 2013 at 20:27 UTC ( #1018442=note: print w/ replies, xml ) Need Help??


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:

  • Tk::Widget for name(), interps() and children() methods.
  • send for send() method and Tk::Receive subroutine.
  • Tk distribution for everything else.

-- Ken


Comment on Re: TK Toplevel Window List
Select or Download Code
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?

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1018442]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others making s'mores by the fire in the courtyard of the Monastery: (8)
As of 2014-07-24 10:54 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    My favorite superfluous repetitious redundant duplicative phrase is:









    Results (159 votes), past polls