[Paul Obermeier] 2002/11/27 Simple image viewer using Img, showing the time needed for reading and displaying the image. package require Img proc CreateScrolledWidget { wType w titleStr args } { frame $w.par if { [string compare $titleStr ""] != 0 } { label $w.par.label -text "$titleStr" } eval { $wType $w.par.widget \ -xscrollcommand "$w.par.xscroll set" \ -yscrollcommand "$w.par.yscroll set" } $args scrollbar $w.par.xscroll -command "$w.par.widget xview" -orient horizontal scrollbar $w.par.yscroll -command "$w.par.widget yview" -orient vertical set rowNo 0 if { [string compare $titleStr ""] != 0 } { set rowNo 1 grid $w.par.label -sticky ew -columnspan 2 } grid $w.par.widget $w.par.yscroll -sticky news grid $w.par.xscroll -sticky ew grid rowconfigure $w.par $rowNo -weight 1 grid columnconfigure $w.par 0 -weight 1 pack $w.par -side top -fill both -expand 1 return $w.par.widget } proc CreateScrolledText { w titleStr args } { return [eval {CreateScrolledWidget text $w $titleStr} $args ] } proc CreateScrolledCanvas { w titleStr args } { return [eval {CreateScrolledWidget canvas $w $titleStr} $args ] } proc OpenFile {} { set imgName [tk_getOpenFile -initialdir $::lastDir -initialfile $::lastFile] if { $imgName != "" } { ReadPhoto $imgName set ::lastDir [file dirname $imgName] set ::lastFile [file tail $imgName] } } proc ReopenFile {} { ReadPhoto [file join $::lastDir $::lastFile] } proc ReadPhoto { name } { set sTime [clock clicks -milliseconds] set retVal [catch {image create photo -file $name} ph] if { $retVal != 0 } { $::timeMsg insert end "Warning: Cannot detect image file format.\n" return } set rTime [clock clicks -milliseconds] set iw [image width $ph] set ih [image height $ph] $::imgCanv itemconfigure MyImage -image $ph set eTime [clock clicks -milliseconds] $::imgCanv configure -scrollregion "0 0 $iw $ih" $::timeMsg insert end "[file tail $name] ($iw x $ih): " $::timeMsg insert end \ "[format "Read: %.2f sec " [expr ($rTime - $sTime) / 1.0E3]]" $::timeMsg insert end \ "[format "Display: %.2f sec" [expr ($eTime - $rTime) / 1.0E3]]" $::timeMsg insert end "\n" $::timeMsg see end } proc DeletePhotos {} { foreach ph [image names] { image delete $ph } } wm title . "Timed image viewer" set lastDir [pwd] set lastFile "" frame .cmd frame .view -borderwidth 2 -relief sunken frame .msg grid .cmd -row 0 -sticky new grid .msg -row 1 -sticky new grid .view -row 2 -sticky news grid rowconfigure . 2 -weight 1 grid columnconfigure . 0 -weight 1 button .cmd.open -text "Open image ..." -command OpenFile button .cmd.reopen -text "Reopen image" -command ReopenFile button .cmd.clr -text "Clear images" -command DeletePhotos pack .cmd.open .cmd.reopen .cmd.clr -side left -expand 1 -fill x set imgCanv [CreateScrolledCanvas .view ""] $imgCanv create image 0 0 -anchor nw -tag "MyImage" set timeMsg [CreateScrolledText .msg "Timings" -height 5]