use Tk; my $mw = MainWindow->new; my %btns; for (qw(alpha beta gamma)){ my $name = $_; $btns{$_} = $mw->Button( -text => $_, -command => sub{foo($name)}, )->pack; } MainLoop; sub foo{ my $name = shift; for (keys %btns){ $btns{$_}->configure(-state => 'disabled'); } my %dispatch =( alpha => \&alpha, beta => \&beta, gamma => \&gamma, ); $dispatch{$name}->($name); for (keys %btns){ $btns{$_}->configure(-state => 'normal'); } } sub alpha{ print "alpha\n"; sleep 4; } sub beta{ print "beta\n"; sleep 4; } sub gamma{ print "gamma\n"; sleep 4; }