use Tk; use strict; my $mw = MainWindow->new; my $c = $mw->Scrolled('Canvas', -width => 200, -height => 200, -background =>'blue', -scrollregion => [ 0, 0, 500, 500 ] )->pack(qw/-expand 1 -fill both/); ## Bind Both Press and Release events my $keyHR = {}; $mw->bind('', [\&ButtonPress, "up", $keyHR]); $mw->bind('', [\&ButtonPress, "down", $keyHR]); $mw->bind('', [\&ButtonPress, "right", $keyHR]); $mw->bind('', [\&ButtonPress, "left", $keyHR]); $mw->bind('', [\&ButtonRelease, "up", $keyHR]); $mw->bind('', [\&ButtonRelease, "down", $keyHR]); $mw->bind('', [\&ButtonRelease, "right", $keyHR]); $mw->bind('', [\&ButtonRelease, "left", $keyHR]); my $rect = $c->createRectangle(100, 100, 150, 150, -fill => 'yellow'); MainLoop; sub ButtonRelease { my ($w, $dirKey, $keyHR) = @_; $keyHR->{$dirKey} = 0; Move($keyHR); } sub ButtonPress { my ($w, $dirKey, $keyHR) = @_; $keyHR->{$dirKey} = 1; Move($keyHR); } sub Move { my $keyHR = shift; my $speed = 5; my $x = 0; $x += $speed if $keyHR->{right}; $x -= $speed if $keyHR->{left}; my $y = 0; $y += $speed if $keyHR->{down}; $y -= $speed if $keyHR->{up}; $c->move($rect, $x, $y); }