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 ygenommen 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.
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]
}