Tk :: Animation отвечает только за анимацию файла Gif. Анимация в этом случае означает, что все время меняются кадры. Таким образом, движение ограничено содержанием самого изображения.
Если вы хотите переместить изображение целиком на холсте, вы должны использовать метод перемещения. Конечно, это можно сочетать с анимацией GIF.
Вот пример с перемещением картинки слева направо:
#!perl
use strict;
use warnings;
use Tk;
use Tk::Animation;
my $mw = MainWindow->new();
$mw->configure(-background=>"black");
$mw->geometry("200x100");
my $canvas = $mw->Canvas(
-width => 200,
-height => 100,
-background => 'black',
)->pack(
-expand => 1,
-fill => 'both',
);
my $image = $mw->Animation(
-format => 'gif',
-file => 'oi.gif',
# please use this one: http://images1.wikia.nocookie.net/vaultarmory/images/2/23/Gif_dancinggir.gif
);
# -- clear transparent background while drawing
$image->set_disposal_method( 1 );
my $id_of_image_in_canvas = $canvas->createImage(
50, 50,
-image=> $image,
);
$image->start_animation(80);
# -- store the current mving direction
my $direction = 'moving2left';
$mw->repeat(600, \&move_item_in_canvas);
$mw->MainLoop();
exit(0);
sub move_item_in_canvas {
# -- get current location
my ($x1, $y1, $x2, $y2) = $canvas->bbox($id_of_image_in_canvas);
# -- compute if to move left or right
my $min_left = 0;
my $max_right = 200;
if( $direction eq 'moving2left' && $x1 > $min_left ) {
# continue moving left
$canvas->move($id_of_image_in_canvas, -10, 0);
}elsif( $direction eq 'moving2left' && $x1 <= $min_left ) {
# change direction, move to the right
$direction = 'moving2right';
$canvas->move($id_of_image_in_canvas, 10, 0);
}elsif( $direction eq 'moving2right' && $x2 < $max_right ) {
# move right
$canvas->move($id_of_image_in_canvas, 10, 0);
}elsif( $direction eq 'moving2right' && $x2 >= $max_right ){
# change direction, move to the left
$direction = 'moving2left';
$canvas->move($id_of_image_in_canvas, -10, 0);
}else{
die('Error: don\'t know what to do in this case.');
}
return;
} # /move_item_in_canvas