$table->put($displacedButton->{'row'},$displacedButton->'col'},$displacedButton->cget(-text)); #### use warnings; use strict; use Tk; use Tk::Table; use Data::Dumper; my $buttonsPerRow = 5; $buttonsPerRow -= 1; my $row = 1; my $col = 1; my $buttonNum = 0; my @buttons; my $mw = tkinit(); my $menuFrame = $mw->Frame()->pack(-expand=>1,-fill=>'both'); my $buttonFrame = $mw->Frame()->pack(-expand=>1,-fill=>'both'); my $table = $buttonFrame->Table( -columns => 5, -scrollbars => 'se', -fixedrows => 1, )->pack(-expand=>1,-fill=>'both'); my $addButton = $menuFrame->Button( -text => 'Add Button', -command => sub{ $buttons[$buttonNum] = $table->Button(); print "Button $buttonNum->$row:$col\n"; $buttons[$buttonNum]{'row'} = $row; $buttons[$buttonNum]{'col'} = $col; $table->put($row,$col,$buttons[$buttonNum]); configureButton($buttonNum); $col>$buttonsPerRow?$row++:undef; $col>$buttonsPerRow?$col=1:$col++; $buttonNum++; }, )->pack(-side=>'top'); ################################ my $isDragging = 0; #boolean - left mouse button pressed and dragging my $selectedButton = 0; $mw->bind('', \&motion); ################################ $mw->MainLoop(); sub configureButton{ my $btnNum = shift; $buttons[$btnNum]->bind('', sub{ $selectedButton = $btnNum; } ); $buttons[$btnNum]->configure( -text => "Button $btnNum", -command => sub{ print "Button $btnNum pressed\n"; } ); $buttons[$btnNum]->bind('', \&buttonPress); $buttons[$btnNum]->bind('', \&buttonRelease); } sub motion { my($widget) = @_; my $e = $widget->XEvent; if ($isDragging){ slideButton(findCell($e->X,$e->Y)); } return unless $isDragging; } sub buttonPress { $isDragging = 1; } sub buttonRelease { $isDragging = 0; } sub findCell{ my $tmpX = shift; my $tmpY = shift; my ( $row, $col ) = $table->Posn($table->containing($tmpX,$tmpY)); return ($row,$col,$tmpX,$tmpY); } sub slideButton{ my ($mRow,$mCol,$tmpX,$tmpY) = @_; return unless $mRow; print $buttons[$selectedButton]{'row'} . ":" . $buttons[$selectedButton]{'col'} . "\n"; my $displacedButton = $table->containing($tmpX,$tmpY); $displacedButton->{'row'} = $buttons[$selectedButton]{'row'}; $displacedButton->{'col'} = $buttons[$selectedButton]{'col'}; $table->put($displacedButton->{'row'},$displacedButton->{'col'},$displacedButton->cget(-text)); $table->put($mRow,$mCol,$buttons[$selectedButton]); $buttons[$selectedButton]{'row'} = $mRow; $buttons[$selectedButton]{'col'} = $mCol; print "Row:$mRow : Col: $mCol\n"; }