Re: How to use a tcl/tk widget that needs a tcl array

[email protected] (Jeff Hobbs) Thu, 28 Oct 2010 12:25:54 -0700
Newsgroups perl.tcltk
Message-ID <[email protected]>
On 28/10/2010 7:41 AM, Lindley, Robert A wrote:
> I made that temporary change to Tkx.pm and Tktable -variable worked with your version of tie. However there is a conflict of interests here as illustrated by the attached code. (Only works with your Tkx.pm patch.)
>
> First, anything in the tied Perl hash is lost after the tie. Just noted because if you know it is happening it is not a problem.

This is "by design" of tied variables.  You want to instantiate and tie 
before putting any data in.

> Second, if one is using Tcl.pm elsewhere in the program the same named Tcl variable resides in a different name space. It is not real neat to have more than one Tcl interp object around. That is probably why the one inside Tkx.pm is a private one.

Actually it is more subtle than that.  You are actually creating 
multiple Tcl interpreters (same as having multiple Perl interps).  This 
means it's not just hiding $interp in another namespace, it's an 
entirely separate interpreter.  Each is distinct with full interp context.

Jeff

> -----Original Message-----
> From: Jeff Hobbs [mailto:[email protected]]
> Sent: Wednesday, October 27, 2010 6:37 PM
> To: Lindley, Robert A; Gisle Aas; Tcl/Tk Mailing List
> Subject: Re: How to use a tcl/tk widget that needs a tcl array
>
> On 2010-10-22, at 10:01 AM, Lindley, Robert A wrote:
>> I would like to use the tktable widget, but can't find any information
>> on how to pass something as the -variable option and be able to
>> display and retrieve data.
>>
>>     use Tkx;
>>     Tkx::package_require("Tktable");
>>
>>     my $mw = Tkx::widget->new(".");
>>     my $t = $mw->new_table(
>>         -rows =>  5,
>>         -cols =>  3,
>>     );
>>     $t->g_pack;
>>
>>     Tkx::MainLoop()
>>
>> I found the above in the ActiveState documentation. It works as expected.
>>
>> All attempts to display or retrieve data have failed.
>
> So in working with Bob to address this, I found that there is a key
> missing feature in Tkx to support the final solution - obtaining the
> $interp used by Tkx.
>
> My first point was that the table by default needs a data source. The
> easiest is to use '-cache =>  1' to say cache data in memory. To tie it
> to a hash, you need to use tie and reference the tied name in Tcl (.e.g
> -variable =>  'myarray').  It turns out the docs for Tcl.pm are incorrect
> in not quoting Tcl::Var, but it would look like this:
>
> tie %hash, 'Tcl::Var', $interp, "myarray";
>
> The real problem though is how do you get $interp from Tkx?  It looks
> like you don't.  It's a 'my' var in Tkx::i namespace, and the rest of
> the package handily abstracts everything so neatly that you don't need
> access to $interp.  EXCEPT in this one case.  I patched Tkx to have
>
> sub interp { return $interp; }
>
> in the Tkx::i namespace, which would allow:
>
> tie %hash, 'Tcl::Var', Tkx::i::interp(), "myarray";
>
> and checked that this does work with the attached sources.  The question
> is, is this the correct answer?  Should Tkx have a different redirect
> for 'tie', or should there be another way to get the $interp reference
> that Tkx uses?
>
> Gisle - any thoughts on this?
>
> Jeff