GPS Mon Nov 5, 2001 - at the Tk 9.0 WishList MCL asked about adding the ability to scroll widgets with the scale widget. So, I wrote this code as an example.
Updated Thu Aug 29, 2002
#!/bin/wish8.3 proc - {num1 num2} { return [expr {$num1 - $num2}] } proc + {num1 num2} { return [expr {$num1 + $num2}] } proc * {num1 num2} { return [expr {$num1 * $num2}] } proc / {num1 num2} { return [expr {$num1 / $num2}] } set ::locked 0 proc updateScale {win first last} { if {$::locked} { return } set offset [- $last $first] set total [- 1.0 $offset] if {$total <= 0.0} { return } set fract [/ 100 $total] set pos [* $fract $first] set pos [expr int($pos)] $win set $pos } proc scrollText {win pos} { if {!$::locked} { return } foreach {first last} [$win yview] break set offset [- $last $first] set total [- 1.0 $offset] if {$total <= 0.0} { #avoid divide by 0 return } set fract [/ $total 100] set newYview [* $fract $pos] $win yview moveto $newYview } proc main {} { #pack [scrollbar .s -command ".t yview"] -side left -fill y pack [scale .s -show 0 -command {scrollText .t} -from 0 -to 100] -side left -fill y bind .s <ButtonPress-1> "set ::locked 1" bind .s <ButtonRelease-1> "set ::locked 0" pack [text .t -yscrollcommand {updateScale .s} -height 20 -width 20] -side left -fill both -expand 1 set data "My name is George.\nI like Tcl/Tk most of the time.\nI like Xlib sometimes too.\nWhy is programming so difficult?\n" set data [string repeat $data 12] .t insert end $data #Perhaps with a mixture of tag range and checking which lines are at index @0,0 and index @0,[winfo height .t] #we can make text with the elide attribute work properly with scrolling. #.t tag add elide_t 10.0 25.0 .t tag configure elide_t -elide 1 } main