ActiveStatePerl is the easiest way to go, and Tk is automatically included in ActiveStatePerl. The one drawback to ActiveState is the need to get precompiled ppms for the various binary modules, it's very hard to compile them yourself. If you are looking for something that will allow you to compile your binary modules, see Are you using Vanilla/Strawberry Perl? Tell me about it!
Most people have little trouble with running Tk on ActiveState ( there are the minor incompatibilities). You can also avoid using getopenfile on windows with something like the following:
#!/usr/bin/perl
use strict;
use Tk;
require Tk::DirTree;
require Tk::Adjuster;
require Tk::TList;
# The initial directory
my $initial_dir = '/';
# The main window...
my $main = new MainWindow( -title => 'Explorer)' );
# A frame for the tree, adjuster and tlist
my $tree_adj_tablist = $main->Frame();
$tree_adj_tablist->pack(
-expand => 'yes',
-fill => 'both',
-side => 'top'
);
# A scrolled directory tree
my $tree = $tree_adj_tablist->Scrolled(
'DirTree',
-width => 35,
-height => 25,
-scrollbars => 'osoe',
-background => 'White',
-selectmode => 'single',
-selectbackground => 'DarkBlue',
-selectforeground => 'White',
-showhidden => 1,
-directory => $initial_dir
);
$tree->pack(
-expand => 'yes',
-fill => 'both',
-padx => 2,
-pady => 2,
-side => 'left'
);
# An adjuster
my $adjuster = $tree_adj_tablist->Adjuster(
-widget => $tree,
-side => 'left'
);
$adjuster->pack( -side => 'left', -fill => 'y' );
# A scrolled tab_list widget
my $tab_list = $tree_adj_tablist->Scrolled(
'TList',
-background => 'White',
-orient => 'vertical',
-selectmode => 'extended',
-scrollbars => 'os'
);
$tab_list->pack(
-expand => 'yes',
-fill => 'both',
-padx => 2,
-pady => 2,
-side => 'right'
);
# Ok button
my $ok = $main->Button(
-text => 'Ok',
-underline => 0,
-width => 4,
-command => sub { my $selected = $tab_list->info('selection');
#print "@{$selected}\n";
foreach( @{$selected} ){
print $tab_list->entrycget($_, '-text'),"\n";
}
})->pack( -side => 'right', -padx => 10, -pady => 10 );
# A Quit button (will be suppressed???...)
my $quit = $main->Button(
-text => 'Quit',
-underline => 0,
-width => 6,
-command => sub { exit }
);
$quit->pack( -side => 'right', -padx => 10, -pady => 10 );
# Configuring tree and tab_list widgets...
$tree->configure( -browsecmd => sub { list_dir( $tab_list, @_ ); } );
# We list the content of the initial dir inside the tab_list
list_dir( $tab_list, $initial_dir );
MainLoop();
#---------------------------------------------------------------------
+-------
# Displays Dirs and files in TList widget
sub list_dir {
my ( $tab_list, $path ) = @_;
# Erase the TList content
$tab_list->delete( 0, 'end' );
opendir MY_DIR, $path or return;
foreach my $file ( sort readdir(MY_DIR) ) {
# Do not display '.' and '..'
next if ( $file eq '.' or $file eq '..' );
# Insert the files in the TList
$tab_list->insert( 'end', -text => $file );
}
closedir MY_DIR;
}
|