home *** CD-ROM | disk | FTP | other *** search
/ Practical Programming in Tcl & Tk (4th Edition) / TCLBOOK4.BIN / mac / exsource.old / 35_13.tcl < prev    next >
Text File  |  2003-04-15  |  2KB  |  77 lines

  1. #
  2. # Example 35-13
  3. # Using a canvas to scroll a set of widgets.
  4. #
  5.  
  6. proc Example35-13 { top title labels } {
  7.     # Create a resizable toplevel window
  8.     toplevel $top
  9.     wm minsize $top 200 100
  10.     wm title $top $title
  11.  
  12.     # Create a frame for buttons,
  13.     # Only Dismiss does anything useful
  14.     set f [frame $top.buttons -bd 4]
  15.     button $f.quit -text Dismiss -command "destroy $top"
  16.     button $f.save -text Save
  17.     button $f.reset -text Reset
  18.     pack $f.quit $f.save $f.reset -side right
  19.     pack $f -side top -fill x
  20.  
  21.     # Create a scrolling canvas
  22.     frame $top.c
  23.     canvas $top.c.canvas -width 10 -height 10 \
  24.         -yscrollcommand [list $top.c.yscroll set]
  25.     scrollbar $top.c.yscroll -orient vertical \
  26.         -command [list $top.c.canvas yview]
  27.     pack $top.c.yscroll -side right -fill y
  28.     pack $top.c.canvas -side left -fill both -expand true
  29.     pack $top.c -side top -fill both -expand true
  30.  
  31.     Scrolled_EntrySet $top.c.canvas $labels
  32. }
  33. proc Scrolled_EntrySet { canvas labels } {
  34.     # Create one frame to hold everything
  35.     # and position it on the canvas
  36.     set f [frame $canvas.f -bd 0]
  37.     $canvas create window 0 0 -anchor nw -window $f
  38.  
  39.     # Create and grid the labeled entries
  40.     set i 0
  41.     foreach label $labels {
  42.         label $f.label$i -text $label
  43.         entry $f.entry$i
  44.         grid $f.label$i $f.entry$i
  45.         grid $f.label$i -sticky w
  46.         grid $f.entry$i -sticky we
  47.         incr i
  48.     }
  49.     set child $f.entry0
  50.  
  51.     # Wait for the window to become visible and then
  52.     # set up the scroll region based on
  53.     # the requested size of the frame, and set 
  54.     # the scroll increment based on the
  55.     # requested height of the widgets
  56.  
  57.     tkwait visibility $child
  58.     set bbox [grid bbox $f 0 0]
  59.     set incr [lindex $bbox 3]
  60.     set width [winfo reqwidth $f]
  61.     set height [winfo reqheight $f]
  62.     $canvas config -scrollregion "0 0 $width $height"
  63.     $canvas config -yscrollincrement $incr
  64.     set max [llength $labels]
  65.     if {$max > 10} {
  66.         set max 10
  67.     }
  68.     set height [expr $incr * $max]
  69.     $canvas config -width $width -height $height
  70. }
  71. Example35-13 .ex "An example" {
  72.     alpha beta gamma delta epsilon zeta eta theta iota kappa
  73.     lambda mu nu xi omicron pi rho sigma tau upsilon
  74.     phi chi psi omega}
  75.  
  76.  
  77.