#!/usr/local/bin/perl use Tk; # Main Window $mw = new MainWindow; my $var; my $opt = $mw -> Optionmenu(-options => [qw(opt1 opt2 opt3 opt4 dinner1 dinner2 dinner3 dinner4 desert1 desert2 desert3 desert4 desert5 )], -variable => \$var )->pack; $opt->addOptions('dinner5'); $mw->Button(-text=>'Exit', -command=>sub{$mw->destroy})->pack; MainLoop; #### sub addOptions { my $w = shift; my $menu = $w->menu; my $tvar = $w->cget(-textvariable); my $vvar = $w->cget(-variable); my $oldt = $$tvar; my $width = $w->cget('-width'); my %hash; my %MainFields; my $first; while (@_) { my $val = shift; my $label = $val; if (ref $val) { if ($vvar == $tvar) { my $new = $label; $w->configure(-textvariable => ($tvar = \$new)); } ($label, $val) = @$val; } my $len = length($label); $width = $len if (!defined($width) || $len > $width); ##### BEGIN CHANGED ####### if ( $label eq '-') { $menu->separator() } elsif ( $label =~ /^(\w+)(\d+)$/ ) { my ($One, $Two)=($1, $2); if ( !defined($MainFields{'DaTa'.$One}) ) { $MainFields{'DaTa'.$One}=$menu->Cascade(-label=>$One); } $MainFields{'DaTa'.$One}->command(-label =>$One.$Two,-command => [ $w , 'setOption', $One.$Two ]); } else { $menu->command(-label => $label, -command => [ $w , 'setOption', $label, $val ]); } ##### END CHANGED ####### # $menu->command(-label => $label, -command => [ $w , 'setOption', $label, $val ]); $hash{$label} = $val; $first = $label unless defined $first; } if (!defined($oldt) || !exists($hash{$oldt})) { $w->setOption($first, $hash{$first}) if defined $first; } $w->configure('-width' => $width); }