OK, try the one below instead (with ::scroll call removed). Also, plase don't forget to do the followign test with large graphics objects and test scrollbar behavior:
1) create iemlib's number2 2) adjust its height to 60 and its font size to 50 3) drag it as far to the top as possible and what you will likely discover is that it fails to reach the top corner *or* creates scrollbars even though the object fits comfortably within the window. This is not the case AFAIK with the version below.
Ico
proc pdtk_canvas_getscroll {name} { global pdtk_canvas_mouseup_name global pdtk_canvas_mouseup_xminval global pdtk_canvas_mouseup_xmaxval global pdtk_canvas_mouseup_yminval global pdtk_canvas_mouseup_ymaxval
#bbox all is not accurate enough #particularly when using large iemlib objects #so we calculate canvas size manually #set size [$name bbox all]
#borrowed from http://wiki.tcl.tk/4844 set x1 1.0e30; set x2 -1.0e30 ; set y1 1.0e30; set y2 -1.0e30 ; foreach item [$name find all] { switch -exact [$name type $item] { "arc" - "line" - "oval" - "polygon" - "rectangle" { set coords [$name coords $item] foreach {x y} $coords { if { $x < $x1 } {set x1 $x} if { $x > $x2 } {set x2 $x} if { $y < $y1 } {set y1 $y} if { $y > $y2 } {set y2 $y} } } } } if {$x1 != 1.0e30} {
set xminval 0 set yminval 0 set xmaxval 100 set ymaxval 20 #set x1 [lindex $size 0] #set x2 [lindex $size 2] #set y1 [lindex $size 1] #set y2 [lindex $size 3]
#pdtk_post "bbox all: $x1 $x2 $y1 $y2\n" #pdtk_post "new bbox all: $xbox1 $xbox2 $ybox1 $ybox2\n"
#these work much better than the ones below #they allow for intelligent translation of the canvas #rather than introducing redundant scrollbars set xminval $x1 set yminval $y1
set xmaxval [expr $x1+($x2-$x1)] set ymaxval [expr $y1+($y2-$y1)]
#if {$x1 < $xminval} {set xminval $x1} #if {$y1 < $yminval} {set yminval $y1}
#if {$x2 > $xmaxval} {set xmaxval $x2} #if {$y2 > $ymaxval} {set ymaxval $y2}
#pdtk_post "$xminval $xmaxval $yminval $ymaxval\n"
set parentname [winfo parent $name] set winwidth [winfo width $parentname] set winheight [winfo height $parentname]
set canvaswidth [ expr {abs($xmaxval-$xminval)} ] set canvasheight [ expr {abs($ymaxval-$yminval)} ] #set canvaswidth [ expr {abs($xminval)+$xmaxval} ] #set canvasheight [ expr {abs($yminval)+$ymaxval} ]
#pdtk_post "$canvaswidth $canvasheight\n"
#pdtk_post "$parentname [$parentname.scroll cget -state]\n"
#pdtk_post "scroll=yes $winwidth $canvaswidth\n" if {$winwidth > $canvaswidth} {pack forget $parentname.scrollhort} if {$winheight > $canvasheight} {pack forget $parentname.scrollvert} if {$winwidth < $canvaswidth} {pack $parentname.scrollhort -fill x \ -side bottom -before $parentname.c} if {$winheight < $canvasheight} {pack $parentname.scrollvert -fill y \ -side right -before $parentname.c}
if {$pdtk_canvas_mouseup_name != $name || \ $pdtk_canvas_mouseup_xminval != $xminval || \ $pdtk_canvas_mouseup_xmaxval != $xmaxval || \ $pdtk_canvas_mouseup_yminval != $yminval || \ $pdtk_canvas_mouseup_ymaxval != $ymaxval } { set newsize "$xminval $yminval $xmaxval $ymaxval" $name configure -scrollregion $newsize set pdtk_canvas_mouseup_name $name set pdtk_canvas_mouseup_xminval $xminval set pdtk_canvas_mouseup_xmaxval $xmaxval set pdtk_canvas_mouseup_yminval $yminval set pdtk_canvas_mouseup_ymaxval $ymaxval } } pdtk_canvas_checkgeometry [canvastosym $name] }