Beefy Boxes and Bandwidth Generously Provided by pair Networks
Think about Loose Coupling
 
PerlMonks  

comment on

( [id://3333]=superdoc: print w/replies, xml ) Need Help??
I ran your code, and saw one problem immediately.
#Here are some fake buttons using sub-canvas: my $scan1 = $rightframe-> Canvas(-width => 64, -height => 54, -highlig +htthickness => 0); my $scan2 = $rightframe-> Canvas(-width => 64, -height => 54, -highlig +htthickness => 0); my $scan3 = $rightframe-> Canvas(-width => 64, -height => 54, -highlig +htthickness => 0); &scan1start; MainLoop; sub reset { my @buttons = ($scan1,$scan2,$scan3); foreach (@buttons) { $_-> destroy; } #&scan1start; } sub scan1start { if ($numscan1 == 0) { $scan1-> form(-left => '187', -top => '319'); $scan1-> configure(-background => 'black'); $scan1-> Tk::bind('<Button-1>' => sub { .... etc .... etc .... etc }
You define $scan1, $scan2, $scan3 globally, then destroy them in your reset sub. Then without recreating them, you try to access them in &scan1start.

Although it dosn't address all your issues, you might start by tring something like this:

#!/usr/bin/perl use warnings; use Tk; use strict; my $mw = new MainWindow; $mw-> geometry('640x480'); $mw-> resizable( 0, 0 ); my $numscan1 = 0; my $numscan2 = 0; my $numscan3 = 0; my $leftframe = $mw-> Frame(); $leftframe->form(-left => '%0', -right => '%25', -bottom => '%99', -to +p => '%1'); my $resetb = $leftframe-> Button(-text => 'Reset', -command => \&reset + )->form(-left => '%50', -top => '%50'); my $rightframe = $mw-> Frame(-relief => 'groove', -borderwidth => 1); $rightframe-> form(-left => $leftframe, -right => '%99', -bottom => '% +99', -top => '%1'); my $maincanvas = $rightframe-> Canvas(-background => 'blue', -highligh +tthickness => 0); $maincanvas-> form(-left => '%1', -right => '%99', -bottom => '%99', - +top => '%1'); #Here are some fake buttons using sub-canvas: #my $scan1 = $rightframe-> Canvas(-width => 64, -height => 54, -highli +ghtthickness => 0); #my $scan2 = $rightframe-> Canvas(-width => 64, -height => 54, -highli +ghtthickness => 0); #my $scan3 = $rightframe-> Canvas(-width => 64, -height => 54, -highli +ghtthickness => 0); my $scan1; my $scan2; my $scan3; &scan1start; MainLoop; sub reset { my @buttons = ($scan1,$scan2,$scan3); foreach (@buttons) { $_-> destroy; } &scan1start; } sub scan1start { $scan1 = $rightframe-> Canvas(-width => 64, -height => 54, -highlight +thickness => 0); $scan2 = $rightframe-> Canvas(-width => 64, -height => 54, -highlight +thickness => 0); $scan3 = $rightframe-> Canvas(-width => 64, -height => 54, -highlight +thickness => 0); if ($numscan1 == 0) { $scan1-> form(-left => '187', -top => '319'); $scan1-> configure(-background => 'black'); $scan1-> Tk::bind('<Button-1>' => sub { $numscan1 = 1; &scan2start; &scan3start; &scan1start; } ); $scan1-> Tk::bind('<Button-3>' => sub { }); } elsif ($numscan1 == 1) { $scan1-> form(-left => '187', -top => '319'); $scan1-> configure(-background => 'white'); $scan1-> Tk::bind('<Button-3>' => sub { if (($numscan2 == 0) && ($numscan3 == 0)) { $scan2->formForget; $scan3->formForget; $numscan1 = 0; &scan1start; } } ); $scan1-> Tk::bind('<Button-1>' => sub { }); } } sub scan2start { if ($numscan2 == 0) { $scan2-> form(-left => '102', -top => '211'); $scan2-> configure(-background => 'black'); $scan2-> Tk::bind('<Button-1>' => sub { $numscan2 = 1; &scan2start; } ); $scan2-> Tk::bind('<Button-3>' => sub { }); } elsif ($numscan2 == 1) { $scan2-> form(-left => '102', -top => '211'); $scan2-> configure(-background => 'white'); $scan2-> Tk::bind('<Button-3>' => sub { $numscan2 = 0; &scan2start; } ); $scan2-> Tk::bind('<Button-1>' => sub { }); } } sub scan3start { if ($numscan3 == 0) { $scan3-> form(-left => '202', -top => '211'); $scan3-> configure(-background => 'black'); $scan3-> Tk::bind('<Button-1>' => sub { $numscan3 = 1; &scan3start; } ); $scan3-> Tk::bind('<Button-3>' => sub { }); } elsif ($numscan3 == 1) { $scan3-> form(-left => '202', -top => '211'); $scan3-> configure(-background => 'white'); $scan3-> Tk::bind('<Button-3>' => sub { $numscan3 = 0; &scan3start; } ); $scan3-> Tk::bind('<Button-1>' => sub { }); } }
P. S. I also notice that you have recursive subroutine called in scan1start(). The way I set it up in the example, or in any Tk script, a recursive widget-creating sub is bound to cause havoc. By the way, why are you not using the createWindow method to embed those sub canvases?

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

In reply to Re: How to destroy and re-create bound widgets by zentara
in thread How to destroy and re-create bound widgets by Phinix

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post; it's "PerlMonks-approved HTML":



  • Are you posting in the right place? Check out Where do I post X? to know for sure.
  • Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
    <code> <a> <b> <big> <blockquote> <br /> <dd> <dl> <dt> <em> <font> <h1> <h2> <h3> <h4> <h5> <h6> <hr /> <i> <li> <nbsp> <ol> <p> <small> <strike> <strong> <sub> <sup> <table> <td> <th> <tr> <tt> <u> <ul>
  • Snippets of code should be wrapped in <code> tags not <pre> tags. In fact, <pre> tags should generally be avoided. If they must be used, extreme care should be taken to ensure that their contents do not have long lines (<70 chars), in order to prevent horizontal scrolling (and possible janitor intervention).
  • Want more info? How to link or How to display code and escape characters are good places to start.
Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others lurking in the Monastery: (5)
As of 2024-04-20 00:31 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found