http://www.perlmonks.org?node_id=1002263


in reply to Re: How to destroy and re-create bound widgets
in thread How to destroy and re-create bound widgets

I did try createWindow... I'm still learning so I've been just experimenting and doing research trying to get the syntax right. Perhaps though you could explain why doing this:

my $canvaswindow = $canvas->createWindow(0,0, -window => $widget); $canvaswindow->Tk::bind('<Button-1>' => sub { &dostuff0 });

...gives me an error saying: "Global symbol "$canvaswindow" requires explicit package name at line 3."

I have created $widget before attempting this, of various types. Is it not possible to create custom event binds on canvas objects? If so, that is why I do not use createWindow. If it is possible I would love to know how.

EDIT: I was able to get things working after I realized that the createWindow method isn't so much creating a new object that gets a reference but rather more like saying "put me here" to a previously created object template.

So, the above instead becomes:

$canvas->createWindow(0,0, -window => $widget); $widget->Tk::bind('<Button-1>' => sub { &dostuff0 });
I'll post a full working example in a bit once I finish the translation. Thanks for all the helpful pointers and syntax examples though!

Replies are listed 'Best First'.
Re^3: How to destroy and re-create bound widgets
by zentara (Archbishop) on Nov 05, 2012 at 10:17 UTC
    It sounds like you, as a beginner, my want to reconsider your design. The first thing I have to say, is why do you need the overlapping secondary sub-canvases? If you can make something on your sub-canvas, you can do the same thing on the underlying canvas. You can still put a background image on the main canvas, then instead of overlaying other canvases, why not create rectangular regions on the base canvas? In any event, look at this example:
    #!/usr/bin/perl use warnings; use strict; use Tk; my $mw = new MainWindow; my $main = $mw -> Scrolled("Canvas",-scrollbars=>'e')-> pack(-side =>'left', -fill => 'both', -expand => 1); my $canvas = $main->Subwidget("canvas"); Tk::bind($canvas, '<MouseWheel>', [ sub {$canvas->yview('scroll', -($_[1] / 120) * 3,'units')}, Ev('D')]); my $see = "\nHaaa, See that and scroll!"; my $info = $main->createText(180, 15, -text => "$see", -font => 'Arial 11 bold' , -fill => 'red'); $main->configure(-scrollregion => [0,0,2000 , 2000]); my $canvas_cube = $main->Canvas(-width => 45, -height => 45, -background => 'green'); my $canvasWindow = $main->createWindow(75,75, -window => $canvas_cube) +; Tk::bind( $canvas_cube, '<Enter>' => sub { print "Enter\n"; }); Tk::bind( $canvas_cube, '<Leave>' => sub { print "Leave\n"; }); Tk::bind( $canvas_cube, '<Button-1>' => sub { print "1\n"; }); $canvas->focus; MainLoop;

    I'm not really a human, but I play one on earth.
    Old Perl Programmer Haiku ................... flash japh