Tags are the most beautiful aspect of the Canvas. This should show you how it's done. :-)
#!/usr/bin/perl
use warnings;
use strict;
use Tk;
my $top = new MainWindow;
my $c=$top->Canvas->pack;
my $circle = $c->createOval(30,30,100,100,
-fill => 'blue',
-tags =>['circle'],
-stipple => 'gray12',
);
my $rect1 = $c->createRectangle(10,10,44,44,
-fill => 'green',
-stipple => 'gray12',
-tags =>['rect1'],
);
my $rect2 = $c->createRectangle(93,93,200,200,
-fill => 'yellow',
-tags =>['rect2'],
-stipple => 'gray12',
);
my $poly1 = $c->createPolygon(0,0, 44,44, 55,55, 90,90, 200,200, 10,10
+0,0,0,
-fill => 'red',
-smooth => 1,
-splinesteps => 100,
-stipple => 'gray12',
-tags =>['poly1'],
);
$c->Tk::bind("<Motion>", [ \&print_xy, Ev('x'), Ev('y') ]);
$c->CanvasBind('<B1-ButtonRelease>', [ \&add_something, Ev('x'), Ev('y
+') ]);
&print_xy($c, 42,42);
MainLoop;
sub print_xy {
my ($canv, $x, $y) = @_;
print "(x,y) = ", $canv->canvasx($x), ", ", $canv->canvasy($y), "\n";
#my $x1 = $x+1;
#my $y1 = $y+1;
#it will actually use a zero size rectangle
my (@current) = $canv->find('overlapping', $x, $y, $x, $y);
foreach my $id(@current){
print $canv->gettags($id),' ';
}
print "\n";
}
sub add_something {
my ($canv, $x, $y) = @_;
print "(x,y) = ", $canv->canvasx($x), ", ", $canv->canvasy($y), "\n";
my $current = $canv->find(qw/withtag current/);
$canv->addtag('aTimeTag'.time, 'withtag', $current);
print join ' ', $canv->gettags($current);
print "\n";
}
|