next up previous contents index
Next: Texteditor Up: Imageviewer Previous: Weitere Tcl-Befehle

Beispiel : iv

In diesem Abschnitt soll eine kleine Applikation entwickelt werden, welche Bild-Dateien (GIF, PPM, PGM) anzeigen kann. Zuerst wird eine Listbox mit einer Scrollbar erzeugt. Die Listbox wird in einer foreach-Schleife mit Dateien gefüllt die mit dem glob-Befehl ausgewählt wurden. Um ein Bild darzustellen kann zwischen zwei Möglichkeiten gewählt werden. Man kann einen Eintrag in der Listbox durch Doppelklick aktivieren und ein eigenes Toplevelfenster erscheint, das den Namen des Bilddatei trägt, oder man klickt den Namen einmal an und betätigt den Open-Button. Da für das Event ButtonPress-1 schon ein Default-Binding besteht, muß der Umweg über den Befehl

Listboxname nearest y
genommen werden. Als Rückgabewert erhält man den Index aus der Listbox, welcher der y-Koordinate des Mauszeigers am nächsten ist. Da in einem Tk-Programm der Name eines Fensters eindeutig sein muß, wird ein globaler Zähler bei jedem Öffnen eines Toplevel-Windows inkrementiert, und der Wert des Zählers als Window-Name vergeben.

 
Figure: Imageviewer iv

Folgendes Listing zeigt eine Implementierung dieses Beispiels:

   #!/usr/bin/wish -f
   #-----------------------------------------------------------#
   #
   # Programmname : iv.tk
   # TK-Version 4.0 TCL-Version 7.4
   # Erstellungsatum: Fri Jun 14 14:38:29 GMT 1996
   #
   #-----------------------------------------------------------#

   proc open_picture { number } {

      global FILENAME
      set pfad [pwd]

      toplevel .$number
      wm title .$number $FILENAME

      image create photo $FILENAME -file $pfad/$FILENAME
      label .$number.picture -image $FILENAME

      button .$number.close -text "Close" -command [ list destroy .$number] 

      pack .$number.picture .$number.close -side top

   }


   set FILENAME "Choose a picture"
   set zaehler 1

   frame .top
   frame .left
   frame .right

   pack .top -side top -anchor w
   pack .left -side left
   pack .right -side right

   label .top.lblfilename -text "Filename: " -anchor w 
   label .top.varfilename -textvariable FILENAME
   pack .top.lblfilename .top.varfilename -anchor w -side left

   listbox .left.bilddateien -relief sunken -borderwidth 2 -yscrollcommand \
         ".left.bilddateienscroll set"
   scrollbar .left.bilddateienscroll -command ".left.bilddateien yview"
   pack .left.bilddateien -side left
   pack .left.bilddateienscroll -side right -fill y

   foreach datei [lsort [glob *.gif *.ppm ]] {
      .left.bilddateien insert end $datei
   }

   button .right.open -text "Open" -command { set zaehler [expr $zaehler + 1]
      open_picture $zaehler }
   button .right.exit -text "Exit" -command { exit}
   pack .right.open .right.exit -side top -fill x -padx 4

   bind .left.bilddateien <Double-1> {
   	set FILENAME [selection get]
   	set zaehler [expr $zaehler  +1 ]   
      open_picture $zaehler
   }

   bind .left.bilddateien <ButtonPress-1> {
      set index [.left.bilddateien nearest %y ]
      set FILENAME [.left.bilddateien get $index]
   }



Sascha Scherer
Fri Dec 6 09:58:01 MET 1996