http://qs321.pair.com?node_id=253937


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.