Yeah, that square-bracket suroutine syntax is one of the trickiest aspects of Tk. Here are a couple of other examples which demonstrate things to watch out for(gleamed from usenet, probably written by Ala Qumsieh, a Tk guru). The details are in "perldoc Tk::callbacks" , but that is hard to get without examples.
#!/usr/bin/perl -w
use Tk;
my $xx=99;
sub a{
my $x=$_[0];
my $wm= new MainWindow;
my $l=$wm->Entry(-textvariable => \$x)->pack();
$wm->Button(-text => "Apply",
# -command => [ \&onApply, "$x"])->pack();
-command => [ \&onApply, \$x])->pack();
}
# Here, you specify an anonymous list as the value of the -command opt
+ion,
# which is a legal callback syntax. The problem is that this list will
+ be
# created when the button is created, and the first element in the lis
+t is
# the reference to onApply(), but the second element is the *value* of
+ $x
# at the time the list is created, which is the initial value of $x. T
+he
# variable $x itself has nothing to do with it anymore, so changing it
+
# will not change this anonymous list.
# What you can do is pass a reference to $x instead:
# -command => [\&onApply, \$x],
# and change your onApply() sub to reflect that.
sub onApply{
# my $z=$_[0];
my $z = ${$_[0]};
print "XX=$z\n";
};
&a($xx);
MainLoop();
AND##########################################
#!/usr/bin/perl
#for example the following is wrong
my $row = 0;
my $column = 0;
for (my $i = 9; $i >= 0; $i--)
{
$button{$i} = $mw->Button(-text => "$i",
-width => '3',
-height => '1',
-command => &numpress($i))
->grid(-row => $row,
-column => $column);
$column++;
if($column > 2){$column = 0; $row++;}
}
MainLoop;
#######################################################
# Now the problem is here:
-command => &numpress($i))
# The thing being assigned to the "-command" attribute needs
# to be an anonymous subroutine, a reference to a named subroutine,
# or else a reference to an array whose elements are:
# named_subroutine_ref, arg1(, arg2 ...) -- in other words,
# either of the following would be the right way to do what you want:
-command => sub { numpress( $i ) }
# or
-command => [ \&numpress, $i ]
#The way you had it written, your subroutine is actually being called
+
#when the Button is being created, and Perl/Tk is trying to use the
#return value of the sub as the value for "-command" -- not good.
I'm not really a human, but I play one on earth.
flash japh
|