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