Beefy Boxes and Bandwidth Generously Provided by pair Networks
go ahead... be a heretic

Re^2: How to destroy and re-create bound widgets

by Phinix (Acolyte)
on Nov 05, 2012 at 01:40 UTC ( #1002263=note: print w/replies, xml ) Need Help??

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 }); 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

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1002263]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others taking refuge in the Monastery: (6)
As of 2017-07-23 09:21 GMT
Find Nodes?
    Voting Booth?
    I came, I saw, I ...

    Results (346 votes). Check out past polls.