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?
-
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.