use Tk; my $top = new MainWindow; my $c = $top->Canvas()->pack(); my ($x,$y); # left mouse-button -> create text $top->bind('<1>' => [\&click_left, Ev('x'),Ev('y')]); # shift and left mouse-button -> edit text $top->bind('' => [\&edit, Ev('x'),Ev('y')]); # right mouse-button -> move the text $top->bind('<3>' => [\&move_it, Ev('x'),Ev('y')]); MainLoop; sub click_left { my $e = shift; ($x,$y) = @_; my $t = $top->Toplevel(); my $entry = $t->Entry()->pack(); $entry->focus(); $t->bind('' =>sub{ my $text = $entry->get(); $c->createText($x,$y,-text=>$text); $t->destroy(); }); } sub move_it { my $e = shift; ($x,$y) = @_; my $id = $c->find('closest',$x,$y); $top->bind('' => [\&move, Ev('x'),Ev('y'),$id]); } sub move { my ($e,$xm,$ym,$id) = @_; my $dx = $xm - $x; my $dy = $ym - $y; ($x,$y) = ($x+$dx, $y+$dy); $c->move($id,$dx,$dy); } sub edit { my $e = shift; ($x,$y) = @_; my $id = $c->find('closest',$x,$y); my $text = $c->itemcget($id,'text'); my $t = $top->Toplevel(-title=>"edit"); my $entry = $t->Entry()->pack(); $entry->insert(0,$text); $entry->focus(); $t->bind('' => sub { my $text = $entry->get(); $c->delete($id); $c->createText($x,$y,-text=>$text); $t->destroy(); }); }