# Let's begin by building a trivial GUI
package require Tk
package require Img
wm geom . +0+0
grid [text .t -width 20 -height 10 -cursor tcross -font {Courier 12}]
.t insert end { this widget
contains several
lines of text
to demonstrate
how to magnify
a widget's
content in
another
widget.
}
# We create an image to serve as the magnifier
set mag [image create photo -width 192 -height 192]
# And we display the magnifier in another toplevel
toplevel .mag
wm title .mag Magnifier
grid [label .mag.l -image $mag]
wm geom .mag +400+0
# We establish a binding to make the magnifying glass update when the mouse moves
bind .t <Motion> {magnify %W %x %y}
# And the 'magnify' procedure does all the work.
proc magnify { w x y } {
variable mag
set wid [winfo width $w]
set ht [winfo height $w]
if { $x < 12 } {
set x 12
}
if { $x > $wid - 13 } {
set x [expr { $wid - 13 }]
}
if { $y < 12 } {
set y 12
}
if { $y > $ht - 13 } {
set y [expr { $ht - 13 }]
}
set from [image create photo -format window -data $w]
$mag copy $from \
-from [expr { $x - 12 }] [expr { $y - 12 }] \
[expr { $x + 12 }] [expr { $y + 12 }] \
-to 0 0 191 191 \
-zoom 8
rename $from {}
}Note that this procedure will work only for a single widget. If you need multiple widgets under your magnifier, another page discusses how to capture a window into an image.

