A Program In Tcl/Tk To Demonstrate The Three Geometry Managers : [pack], [grid] and [place]

Just copy the script below. run it. The how-to-use explanation is on the program interface. This code is meant to teach the geometry managers pack, grid and place. This script is working 100%. The funny thing in it, if you make a mistake the Tcl parser will give you the errors, rather than me taking care of them :)

#!/usr/bin/wish


#Author: Rani Fayez Ahmad (Superlinux)
#Script Topic: Tcl/Tk Geometry Managers Demo
#Please read the variable below to know the goal of this script
set labeltext "
  You will have 5 buttons on the window toplevel once you click any of the buttons \[pack\], \[grid\], or \[place\].\n
  Those three buttons correspond to the Tcl/Tk geometry managers \[pack\], \[grid\], and \[place\].\n
  If you run \[pack\] button, it will read the options to set the \[pack\] Tcl command for 5 buttons from each of the 5 entries, \nand display them in the \[pack\] method of geometry management.\n
  If you run \[grid\] button, it will read the options to set the \[grid\] Tcl command for 5 buttons from each of the 5 entries, \nand display them in the \[grid\] method of geometry management.\n
  If you run \[place\] button, it will read the options to set the \[place\] Tcl command for 5 buttons from each of the 5 entries, \nand display them in the \[place\] method of geometry management.\n
 \nThe buttons window paths are of the form .top.b\$i , where \$i can be one of 1,2,3,4, or 5 
 "

wm title . "Tcl/Tk Geometry Managers Demo"
button .pack_button -text "\[pack\] geometry manager" -command { 
.last_geometry_manager configure  -text "Last geometry manager used \[pack\]"
      raise .top
      if  {! [winfo exists .top ]} { toplevel .top }
    for {set i 1 } { $i < 6} {incr i } {
        if  {[winfo exists .top.b$i]} { destroy .top.b$i }
        button .top.b$i -text "button $i"
        pack .top.b$i
      }  
       for {set i 1 } { $i <6 } {incr i } {
       
        set options [.fl$i.ent$i get ]
        eval "pack configure .top.b$i $options" 
        
        }
}

button .grid_button -text "\[grid\] geometry manager" -command { 
.last_geometry_manager configure  -text "Last geometry manager used \[grid\]"
if  {! [winfo exists .top ]} { toplevel .top }
raise .top
    for {set i 1 } { $i < 6} {incr i } {
        if  {[winfo exists .top.b$i]} { destroy .top.b$i }
        button .top.b$i -text "button $i"
        grid .top.b$i
      }  
       for {set i 1 } { $i < 6} {incr i } {
              
        set options [.fl$i.ent$i get ]
        eval "grid configure .top.b$i $options" 
        
        }


}
button .place_button -text "\[place\] geometry manager" -command { 
.last_geometry_manager configure  -text "Last geometry manager used \[place\]"
if  {! [winfo exists .top ]} { toplevel .top }
raise .top
for {set i 1 } { $i < 6} {incr i } {
        if  {[winfo exists .top.b$i]} { destroy .top.b$i }
        button .top.b$i -text "button $i"
        place .top.b$i -y [expr $i*30]
      }  
       for {set i 1 } { $i < 6} {incr i } {
        
        set options [.fl$i.ent$i get ]
        eval "place configure .top.b$i $options" 
        
        }



}



for {set i 1 } { $i < 6} {incr i} {
labelframe .fl$i -text "button $i options entry"
entry .fl$i.ent$i  -width 50
}

pack [label .last_geometry_manager -text "No geometry manager has been used yet!"]

pack .pack_button .grid_button .place_button 
for {set i 1 } { $i < 6} {incr i } {
pack .fl$i .fl$i.ent$i
}



toplevel .top


labelframe .fl_howto -text "How to use this program:"
label .fl_howto.lab -text $labeltext -justify left
pack .fl_howto .fl_howto.lab
button .top.b -text buttton
pack .top.b
destroy .top.b