> I'm writing my GUI using the Tcl::Tk perl module. I've created a BLT > graph widget. I'd like to be able to display the graph element > information if the user mouses over it. I can do this with pure > Tcl/Tk/BLT, but I'm unable to find the right combination of commands > within this Tcl/Tk/BLT perl hybrid. > > In Tcl/Tk, I can figure out which element the user is > interested in by > passing a procedure %x and %y. How is this doable in perl? > When I tried to use Eval, I got strange answers:
yes, the '%' is working different in Tcl::Tk, compared to Perl/Tk the reason lies is some internal optimizations for callbacks within Tcl/Tk The point is - when Tcl/Tk do not see '%x' '%y' etc in its callback string - it even do not fill proper event struct with these values. As a special workaround it was introduced a syntax to fake those %something by \\'xy', so in $widget->method(arg1,arg2, \\'xy', sub {code}); the code within callback will get in this case > > my $graph = $frame->BLTGraph->pack(); > $graph->bind('<Motion>'=>[\&displayInfo,$graph]); > > sub displayInfo { > my $graph = $_[0]; > $int->Eval("$graph element closest %x %y info > -interpolate false"); > } > > Running with this eval command gave the error: > bad screen distance "c63c760": bad window x-coordinate > > Anyway, in summary, the X,Y coordinates of the mouse will need to be > known to determine the information. > Any help would be appreciated. Instead of doing \\'xy', I use another technique to deal with the problem is to bind all given Perl routines at once to Tcl/Tk, and then use them in callbacks with usual %x and %y syntax: Here is a helper sub that I often use: sub Tcl::Tk::bind_ptcl { my $int = shift; no strict 'refs'; for my $subname (keys %::ptcl::) { #deb print STDERR "binding sub $subname\n"; $int->CreateCommand("ptcl_$subname",\&{"ptcl::$subname"}); } for my $varname (keys %::ptclv::) { #deb print STDERR "binding var $varname\n"; tie ${"ptclv::$varname"}, 'Tcl::Var', $int, "ptclv_$varname"; } } it binds all Perl subroutines from ptcl:: package (and also all Perl variables from ptclv package, which is not needed in the current example, but useful approach anyway, IMHO) All I need to do is: 1. create proper callback subroutines in my helper "ptcl::" package sub ptcl::subrg { my (undef,undef,undef, $arg1, $arg2, $arg3) = @_; print "I am subrg arg1=$arg1 arg2=$arg2 arg3=$arg3\n"; } 2. use it from pure-tcltk callback way as (which still uses perl/Tk syntax, BTW) $mw->Button->(-command=>"ptcl_subrg foo bar fluffy")->pack; this way you will not lose %x, %y modifiers, as long as they will be.directly in the string which is passed to Tcl/Tk. Best regards, Vadim.