in reply to
Updating one option menu by the value of another
You need to assign the widget references returned
by the constructors to variables so that your
first Optionmenu can invoke the second Optionmenu's
configure() method to configure the -options
attribute.
Give this code a try and see if it works for you.
You'll have to replace the list of directories
assigned to @myArr with directory
names that exist on your system.
#!/usr/bin/perl
use warnings;
use strict;
use Tk;
use Tk::widgets qw(
Label
Optionmenu
);
my $mw = tkinit;
my $selectedDir;
my @files;
my $path = '.';
my @myArr = qw(foo bar);
my $myFile;
my ($Label1, $OptMenu1, $Label2, $OptMenu2);
$Label2 = $mw->Label(-text => "level2 ");
# no -options: we'll let $OptMenu1 configure -options
$OptMenu2 = $mw->Optionmenu(
-textvariable => \$myFile,
);
$Label1 = $mw->Label(-text => "level1 ");
$OptMenu1 = $mw->Optionmenu(
-textvariable => \$selectedDir,
# -command is invoked when the widget is
# allocated and when a selection is made:
-command => sub {
# redirect the output of ls(1) to /dev/null unless
# you want stderr output on the console
@files = `ls $path/$selectedDir 2>/dev/null`;
#foreach (@files) { chomp() }
chomp @files; # chomp() take a LIST
warn 'configure $OptMenu2'; # who needs a debugger?
$OptMenu2->configure(-options => \@files);
},
-options => \@myArr,
);
$Label1->grid($OptMenu1, $Label2, $OptMenu2);
MainLoop;
Update:
Minor speeling correction.