tags:

views:

47

answers:

3

Hello all. When one creates a new toplevel or button in TK, one needs to enter a pathname. I have seen a basic code which looks like:

toplevel .a
...
button .a.b ...

My question is: Are the dots treated differently than letters? Are they some sort of hierarchy delimiters, which create parent child relationship? I have looked at wiki TK and failed to find an answer to that. Many thanks, -Lior

+2  A: 

Yes, they are! They separate for instance a frame with the content that are widgets:

set f [frame .hello]
button $f.b -text "Hello button"

pack $f.b

pack $f

As you can see in this example, the f is evaluated as variable, not f.b

You can also write pack ${f}.b but this is not needed as the dot is seen not to be part of the variable.

Roalt
Thanks.Is there any link to with examples to that?
Lior Dagan
This example is out of my head, but looks at @skilldrick answer for theory described.
Roalt
+1  A: 

Yes - it's for the hierarchy. Have a look at TkDocs on the subject:

The frame, which was a child of the root, was named ".c". We could have put pretty much anything in place of the "c", naming it for example ".content". This name is purely for use by your program, so it's best to choose something meaningful. The controls that were children of the frame were given names like ".c.feet", ".c.meters", ".c.flbl", and so on. If there were any widgets at a deeper level of the hierarchy, we'd add another "." and then a unique identifier.

Skilldrick
+3  A: 

As other answers have said, dots are used to represent a hierarchy, just as / or \ is used to represent a filesystem hierarchy.

Placing widgets in a hierarchy is not, strictly speaking, necessary. One advantage in doing so is that geometry managers such as grid and pack default to managing children in their parents. For example 'pack .a.b.c' will pack the widget a.b.c within the widget .a.b. This makes it easy to do simple layouts.

The same effect in many cases can be achieved by telling grid and pack into which container a child should be placed. Foe example, 'pack .c -in .a.b' will put the widget .c in the container .a.b. This let's you keep your hierarchy shallow, and makes refactoring a little easier.

See http://www.beedub.com/book/2nd/TKINTRO.doc.html for a good introduction to tk fundamentals.

Bryan Oakley
Well said, Bryan. Another impact on refactoring is that many have the habit of keeping widget names in variables; this affords, among other effects, the opportunity to rewrite a complex sequence with just a "set my_toplevel_name .SOMETHING_NEW" near the beginning.
Cameron Laird