#!/usr/bin/perl use strict; use warnings; use Tk; use Tk::Frame; use Tk::Scrollbar; use Tk::Menu; use Tk::Menubutton; # marker position my $markX; my $markY; my $main = MainWindow->new; $main->geometry('800x600'); my $topPanel = $main->Frame(-width => 800, -height => 550)->pack; $topPanel->Button(-text => 'Quit', -width =>5, -command => [$main => 'destroy'])->pack; # create scrolled canvas my $viewPanel = $main->Frame->pack; my $windowScrol = $viewPanel->Scrolled('Canvas', -width => 800, -height => 550, -scrollregion => [0, 0, 2000, 1000], -bg => 'white', -scrollbars => 'se')->pack; # get reference to actual underlying canvas my ($window, undef) = $windowScrol->Subwidget(); # binding to mouse click $window->Tk::bind("<1>" => [\&marker, Ev('x'), Ev('y')]); MainLoop(); sub marker{ my($id, $Mx, $My) = @_; my $color = '#800000'; my @items = $id->find('withtag', 'mark'); # if marker exists, move it to new position if ($items[0]){ my $Mx = $Mx - $markX; my $My = $My - $markY; for (@items){$id->move($_, $Mx, $My)} # or else create marker }else{ $id->create(('line', $Mx, $My-20, $Mx, $My+20), -fill => $color, -tags => ['mark'],); $id->create(('line', $Mx-20, $My, $Mx+20, $My), -fill => $color, -tags => ['mark'],); } $markX = $Mx; $markY = $My; }