Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw
 
PerlMonks  

TK Toplevel Window List

by Anonymous Monk
on Feb 12, 2013 at 14:08 UTC ( [id://1018370]=perlquestion: print w/replies, xml ) Need Help??

Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

How can a Toplevel window list be retrieved for all toplevel windows? (including windows started from other instantiations of the program)

Replies are listed 'Best First'.
Re: TK Toplevel Window List
by kcott (Archbishop) on Feb 12, 2013 at 20:27 UTC

    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

      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!

Re: TK Toplevel Window List (wm)
by Anonymous Monk on Feb 12, 2013 at 14:11 UTC

    ask the window manager, if it is possible, window manager will know (hint, it manages windows )

    Tk::Wm

      Thank you, but which function would produce a window list? Or perhaps, there is a structure which should be examined?

        If you just wnat to get a list of all the toplevel windows from within a single process, it is pretty easy. Something like this perhaps.

        use warnings; use strict; use Tk; my $mw = MainWindow->new(-title => 'main window'); for (1..5) { $mw->Toplevel(-title => "toplevel #$_"); } for ($mw, $mw->children) { print $_->cget('-title'),"\n" if /Toplevel/ or /MainWindow/; } MainLoop;

        To find windows owned by other processes, you are going to need to interact with the OS window manager and that is going to be very specific to the your needs and the OS/WM you are using. There's no portable easy answer.

        Thank you, but which function would produce a window list?

        Perhaps one with "list" in the documentation, there aren't that many functions, you can find it, grep/ack makes it easier

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://1018370]
Front-paged by Arunbear
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others learning in the Monastery: (3)
As of 2024-04-19 17:11 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found