in reply to How to pass parameter to a subroutine?
You're not storing the j and i values anywhere, so by the time the buttons have been generated, the values will always be the maximum.
I've quickly cleaned up the code. I added the ability to store the values during creation, and use the accurate values when any button is pressed. I updated the subroutine to accept these values as arguments. Most importantly, I added strict and warnings.
use warnings; use strict; use Tk; my $mw = MainWindow->new(-bg=> '#606060', -borderwidth=> 0); my $size = 40; my $y = 0; my $x = 0; my $h = 3*$size; my %frames; for my $j (0..15) { my $x = 0; my $w = 3*$size; for my $i (0..15) { $frames{$j}{$i}{j} = $j; $frames{$j}{$i}{i} = $i; $frames{$j}{$i}{button} = $mw->Button( -text => ' ', -bg => "#60C8BC", -fg => "#000000", -borderwidth => 1, -anchor => 'w', ); $frames{$j}{$i}{button}->bind( '<Button-1>' => sub { &ToggleBox($frames{$j}{$i}{j}, $frames{$j}{$i}{i}); } ); $frames{$j}{$i}{button}->place( -y=>$y, -x=>$x, -width=>$w, -height=>$h ); $x = $x + $w; $w = $size; $x = $x+2 if ($i % 5 == 0); } $y = $y + $h; $h = $size; $y = $y+2 if ($j % 5 == 0); } MainLoop(); sub ToggleBox { my ($j, $i) = @_; print "$j, $i\n"; }
|
|---|