set height 400 set width 600 set borderwidth 2 set hscroll .hscroll set vscroll .vscroll set canvas .c scrollbar $hscroll -orient horiz -command "$canvas xview" scrollbar $vscroll -command "$canvas yview" canvas $canvas -relief sunken -borderwidth $borderwidth \ -width $width -height $height \ -xscrollcommand "$hscroll set" \ -yscrollcommand "$vscroll set" # Ensure that window resizings retain scroll bars. pack $hscroll -side bottom -fill x pack $vscroll -side right -fill y pack $canvas -side right -fill both -expand 1 # Somebody want to express the above in "grid"? # That'd be good practice. # Put something visible on the canvas # so we have a sense of what we're seeing. $canvas create line 0 0 $width $height $canvas create line 0 $height $width 0 $canvas configure -scrollregion [$canvas bbox all]It will be interesting to see when its first fault emerges.
ulis, 2003-07-05: If you need grid in place of pack:
# Ensure that window resizings retain scroll bars. grid $canvas -row 0 -column 0 -sticky nswe grid $vscroll -row 0 -column 1 -sticky ns grid $hscroll -row 1 -column 0 -sticky ew grid rowconfig . 0 -weight 1 grid columnconfig . 0 -weight 1
Important! The usage of this scrolling canvas is that one creates [1] widgets onto the canvas, rather than managing them as children. In particular, if you're trying to
frame $canvas.subframe ...rather than
$canvas add rectangle ...you're headed for trouble.MG Aug 21 2007 - Does anyone have a minimal example of a scrollable canvas meant for containing other widgets? I'm trying to put a frame inside a canvas to scroll it, but my lack of canvas-use in the past is coming back to haunt me, and I can't find any good, small examples of how to do it...MG, a few minutes later Discovered what the problem I was having was, oddly enough on the canvas page - my widgets weren't children of the canvas, and so stuck out over it. Making all the widgets displayed on the canvas children of it solved the problem (thanks DKF!).