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 1Important! 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!).
