![Page 1: Skriptprogrammierung Tcl/Tk von Manuel Caroli Betreuer: Thorsten Brunklaus](https://reader035.vdocuments.site/reader035/viewer/2022062417/55204d6449795902118ba655/html5/thumbnails/1.jpg)
Skriptprogrammierung
Tcl/Tk
von
Manuel Caroli
Betreuer:Thorsten Brunklaus
![Page 2: Skriptprogrammierung Tcl/Tk von Manuel Caroli Betreuer: Thorsten Brunklaus](https://reader035.vdocuments.site/reader035/viewer/2022062417/55204d6449795902118ba655/html5/thumbnails/2.jpg)
Historisches
• Scriptingsprachen gibt es seit den 60er-Jahren
• JCL, Unix Shells, Perl, Visual Basic, Python, JavaScript
• Tcl:
• Ende 80er
• John K. Ousterhout, Berkeley
• aus der Not geboren- Es gab damals nur zu spezielle Kommandosprachen
- Zeitverschwendung für Anpassung auf Tools
![Page 3: Skriptprogrammierung Tcl/Tk von Manuel Caroli Betreuer: Thorsten Brunklaus](https://reader035.vdocuments.site/reader035/viewer/2022062417/55204d6449795902118ba655/html5/thumbnails/3.jpg)
Einleitung: Tcl/Tk
• Tcl: Skriptsprache
• „Tool command language“
• tclsh (Shell für Tcl)
• Tk: erweitert Tcl um Kommandos für GUI
• „Toolkit“
• wish (Windowing Shell)
• Interpreter bzw. Skriptdateien
• „offizielle Aussprache“: Tickle
![Page 4: Skriptprogrammierung Tcl/Tk von Manuel Caroli Betreuer: Thorsten Brunklaus](https://reader035.vdocuments.site/reader035/viewer/2022062417/55204d6449795902118ba655/html5/thumbnails/4.jpg)
Das Kommando-Konzept
• Ein Tcl-Skript besteht aus Kommandos
• Kommandos werden Argumente übergeben
• Argumente sind Strings
• Anzahl der Argumente hängt vom Kommando ab
Kommando Argument 1 Argument nArgument 2
![Page 5: Skriptprogrammierung Tcl/Tk von Manuel Caroli Betreuer: Thorsten Brunklaus](https://reader035.vdocuments.site/reader035/viewer/2022062417/55204d6449795902118ba655/html5/thumbnails/5.jpg)
Das Kommando-Konzept (2)
• Argumente: Trennung durch Leer / Tab
• Kommandos: Trennung durch neue Zeile / ;
• Argumente sind nicht weiter strukturiert
Kommando Argument 1 Argument nArgument 2
![Page 6: Skriptprogrammierung Tcl/Tk von Manuel Caroli Betreuer: Thorsten Brunklaus](https://reader035.vdocuments.site/reader035/viewer/2022062417/55204d6449795902118ba655/html5/thumbnails/6.jpg)
Beispiel: „fac“
proc {fac} {x} {
if {$x <= 1} {return {1}}
{expr {$x * [fac [expr {$x-1}]]}}
}
• Erzeugt ein neues Kommando, hier „fac“
• proc erwartet drei Argumente:
proc {Kommandoname} {Argumentliste} {Block}
proc { fac } { if... }{ x }
![Page 7: Skriptprogrammierung Tcl/Tk von Manuel Caroli Betreuer: Thorsten Brunklaus](https://reader035.vdocuments.site/reader035/viewer/2022062417/55204d6449795902118ba655/html5/thumbnails/7.jpg)
Beispiel: „fac“ (2)
if {$x <= 1} {return {1}}
{expr {$x * [fac [expr {$x-1}]]}}
• if erwartet auch drei Argumente:- if {Bedingung} {Block1} {Block2}
- Bedingung true : Block1
- Bedingung false: Block2
if { $x <= 1 } { ... }{ ret... }
![Page 8: Skriptprogrammierung Tcl/Tk von Manuel Caroli Betreuer: Thorsten Brunklaus](https://reader035.vdocuments.site/reader035/viewer/2022062417/55204d6449795902118ba655/html5/thumbnails/8.jpg)
Quoting
• Quoting geschieht durch {...}
• String bleibt unverändert
• Hier: das Kommando if erhält die Bedingung $x <= 1 zunächst als String
• Beispiel:
set a 10
set b $a => 10
set b {$a} => $a
![Page 9: Skriptprogrammierung Tcl/Tk von Manuel Caroli Betreuer: Thorsten Brunklaus](https://reader035.vdocuments.site/reader035/viewer/2022062417/55204d6449795902118ba655/html5/thumbnails/9.jpg)
Beispiel: „fac“ (3)
expr {$x * [fac [expr {$x - 1}]]}
• expr• Erwartet einen Ausdruck bestehend aus
- Operanden
- Operatoren
- Klammern
• Erwartet mindestens ein Argument
• Argumente werden konkateniert
• Klammern/Quoten ist also nicht notwendig
![Page 10: Skriptprogrammierung Tcl/Tk von Manuel Caroli Betreuer: Thorsten Brunklaus](https://reader035.vdocuments.site/reader035/viewer/2022062417/55204d6449795902118ba655/html5/thumbnails/10.jpg)
Substitution
• 3 Varianten: $, \, [ ... ]• set x 5 => $x wird durch 5 ersetzt
• Sonderzeichen: \$ wird durch $ ersetzt
• [ ... ] wird ausgewertet und dann ersetzt
• Beispiel:
set a {expr 1+2} => expr 1+2
set a [expr 1+2] => 3
![Page 11: Skriptprogrammierung Tcl/Tk von Manuel Caroli Betreuer: Thorsten Brunklaus](https://reader035.vdocuments.site/reader035/viewer/2022062417/55204d6449795902118ba655/html5/thumbnails/11.jpg)
Beispiel: „fac“ (4)
[fac [expr {$x - 1}]]
• fac erwartet wie oben definiert eine Zahl• [expr {$x – 1}] wird zunächst ausgewertet
• Dann kann fac ausgewertet werden
![Page 12: Skriptprogrammierung Tcl/Tk von Manuel Caroli Betreuer: Thorsten Brunklaus](https://reader035.vdocuments.site/reader035/viewer/2022062417/55204d6449795902118ba655/html5/thumbnails/12.jpg)
Quoting (2)
• Weitere Art von Quoting:
• Quoting durch "..."• Trennzeichen (Leerzeichen, neue Zeile) werden
ignoriert
• Substitution wie gewöhnlich
• Beispiel:
set a wort1 wort2 => Fehler
set a "wort1 wort2" => wort1 wort2
![Page 13: Skriptprogrammierung Tcl/Tk von Manuel Caroli Betreuer: Thorsten Brunklaus](https://reader035.vdocuments.site/reader035/viewer/2022062417/55204d6449795902118ba655/html5/thumbnails/13.jpg)
Beispielauswertung „fac 3“
proc fac x {
if "$x <= 1" {return 1} {
expr "$x * [fac [expr {$x – 1}]]"
}
}
fac 3
![Page 14: Skriptprogrammierung Tcl/Tk von Manuel Caroli Betreuer: Thorsten Brunklaus](https://reader035.vdocuments.site/reader035/viewer/2022062417/55204d6449795902118ba655/html5/thumbnails/14.jpg)
Beispielauswertung „fac 3“
proc fac x {
if "$x <= 1" {return 1} {
expr "$x * [fac [expr {$x – 1}]]"
}
}
if "$x <= 1" {return 1} {expr ...}
![Page 15: Skriptprogrammierung Tcl/Tk von Manuel Caroli Betreuer: Thorsten Brunklaus](https://reader035.vdocuments.site/reader035/viewer/2022062417/55204d6449795902118ba655/html5/thumbnails/15.jpg)
Beispielauswertung „fac 3“
proc fac x {
if "$x <= 1" {return 1} {
expr "$x * [fac [expr {$x – 1}]]"
}
}
if "3 <= 1" {return 1} {expr ...}
![Page 16: Skriptprogrammierung Tcl/Tk von Manuel Caroli Betreuer: Thorsten Brunklaus](https://reader035.vdocuments.site/reader035/viewer/2022062417/55204d6449795902118ba655/html5/thumbnails/16.jpg)
Beispielauswertung „fac 3“
proc fac x {
if "$x <= 1" {return 1} {
expr "$x * [fac [expr {$x – 1}]]"
}
}
expr "$x * [fac [expr {$x-1}]]"
![Page 17: Skriptprogrammierung Tcl/Tk von Manuel Caroli Betreuer: Thorsten Brunklaus](https://reader035.vdocuments.site/reader035/viewer/2022062417/55204d6449795902118ba655/html5/thumbnails/17.jpg)
Beispielauswertung „fac 3“
proc fac x {
if "$x <= 1" {return 1} {
expr "$x * [fac [expr {$x – 1}]]"
}
}
expr "3 * [fac [expr {$x-1}]]"
![Page 18: Skriptprogrammierung Tcl/Tk von Manuel Caroli Betreuer: Thorsten Brunklaus](https://reader035.vdocuments.site/reader035/viewer/2022062417/55204d6449795902118ba655/html5/thumbnails/18.jpg)
Beispielauswertung „fac 3“
proc fac x {
if "$x <= 1" {return 1} {
expr "$x * [fac [expr {$x – 1}]]"
}
}
expr "3 * [fac 2]"
![Page 19: Skriptprogrammierung Tcl/Tk von Manuel Caroli Betreuer: Thorsten Brunklaus](https://reader035.vdocuments.site/reader035/viewer/2022062417/55204d6449795902118ba655/html5/thumbnails/19.jpg)
Beispielauswertung „fac 3“
proc fac x {
if "$x <= 1" {return 1} {
expr "$x * [fac [expr {$x – 1}]]"
}
}
expr "3 * [if "$x<=1" {return 1}
{expr...} ]"
![Page 20: Skriptprogrammierung Tcl/Tk von Manuel Caroli Betreuer: Thorsten Brunklaus](https://reader035.vdocuments.site/reader035/viewer/2022062417/55204d6449795902118ba655/html5/thumbnails/20.jpg)
Beispielauswertung „fac 3“
proc fac x {
if "$x <= 1" {return 1} {
expr "$x * [fac [expr {$x – 1}]]"
}
}
expr "3 * [if "2<=1" {return 1}
{expr...} ]"
![Page 21: Skriptprogrammierung Tcl/Tk von Manuel Caroli Betreuer: Thorsten Brunklaus](https://reader035.vdocuments.site/reader035/viewer/2022062417/55204d6449795902118ba655/html5/thumbnails/21.jpg)
Beispielauswertung „fac 3“
proc fac x {
if "$x <= 1" {return 1} {
expr "$x * [fac [expr {$x – 1}]]"
}
}
expr "3 * [expr "$x * [fac
[expr {$x -1}] ]" ]"
![Page 22: Skriptprogrammierung Tcl/Tk von Manuel Caroli Betreuer: Thorsten Brunklaus](https://reader035.vdocuments.site/reader035/viewer/2022062417/55204d6449795902118ba655/html5/thumbnails/22.jpg)
Beispielauswertung „fac 3“
proc fac x {
if "$x <= 1" {return 1} {
expr "$x * [fac [expr {$x – 1}]]"
}
}
expr "3 * [expr "2 * [fac
[expr {$x -1}] ]" ]"
![Page 23: Skriptprogrammierung Tcl/Tk von Manuel Caroli Betreuer: Thorsten Brunklaus](https://reader035.vdocuments.site/reader035/viewer/2022062417/55204d6449795902118ba655/html5/thumbnails/23.jpg)
Beispielauswertung „fac 3“
proc fac x {
if "$x <= 1" {return 1} {
expr "$x * [fac [expr {$x – 1}]]"
}
}
expr "3 * [expr "2 * [fac 1]" ]"
![Page 24: Skriptprogrammierung Tcl/Tk von Manuel Caroli Betreuer: Thorsten Brunklaus](https://reader035.vdocuments.site/reader035/viewer/2022062417/55204d6449795902118ba655/html5/thumbnails/24.jpg)
Beispielauswertung „fac 3“
proc fac x {
if "$x <= 1" {return 1} {
expr "$x * [fac [expr {$x – 1}]]"
}
}
expr "3 * [expr "2 * [
if "$x<=1" {return 1} {expr...} ]" ]"
![Page 25: Skriptprogrammierung Tcl/Tk von Manuel Caroli Betreuer: Thorsten Brunklaus](https://reader035.vdocuments.site/reader035/viewer/2022062417/55204d6449795902118ba655/html5/thumbnails/25.jpg)
Beispielauswertung „fac 3“
proc fac x {
if "$x <= 1" {return 1} {
expr "$x * [fac [expr {$x – 1}]]"
}
}
expr "3 * [expr "2 * [
if "1<=1" {return 1} {expr...} ]" ]"
![Page 26: Skriptprogrammierung Tcl/Tk von Manuel Caroli Betreuer: Thorsten Brunklaus](https://reader035.vdocuments.site/reader035/viewer/2022062417/55204d6449795902118ba655/html5/thumbnails/26.jpg)
Beispielauswertung „fac 3“
proc fac x {
if "$x <= 1" {return 1} {
expr "$x * [fac [expr {$x – 1}]]"
}
}
expr "3 * [expr "2 * [return 1]" ]"
![Page 27: Skriptprogrammierung Tcl/Tk von Manuel Caroli Betreuer: Thorsten Brunklaus](https://reader035.vdocuments.site/reader035/viewer/2022062417/55204d6449795902118ba655/html5/thumbnails/27.jpg)
Beispielauswertung „fac 3“
proc fac x {
if "$x <= 1" {return 1} {
expr "$x * [fac [expr {$x – 1}]]"
}
}
expr "3 * [expr "2 * 1" ]"
![Page 28: Skriptprogrammierung Tcl/Tk von Manuel Caroli Betreuer: Thorsten Brunklaus](https://reader035.vdocuments.site/reader035/viewer/2022062417/55204d6449795902118ba655/html5/thumbnails/28.jpg)
Beispielauswertung „fac 3“
proc fac x {
if "$x <= 1" {return 1} {
expr "$x * [fac [expr {$x – 1}]]"
}
}
expr "3 * 2"
![Page 29: Skriptprogrammierung Tcl/Tk von Manuel Caroli Betreuer: Thorsten Brunklaus](https://reader035.vdocuments.site/reader035/viewer/2022062417/55204d6449795902118ba655/html5/thumbnails/29.jpg)
Beispielauswertung „fac 3“
proc fac x {
if "$x <= 1" {return 1} {
expr "$x * [fac [expr {$x – 1}]]"
}
}
6
![Page 30: Skriptprogrammierung Tcl/Tk von Manuel Caroli Betreuer: Thorsten Brunklaus](https://reader035.vdocuments.site/reader035/viewer/2022062417/55204d6449795902118ba655/html5/thumbnails/30.jpg)
Scoping
• Es gibt lokale und globale Variablen.
• global x y macht die Variablen x und y innerhalb einer Prozedur verfügbar.
• Das Kommandoproc makeA {} { global A set A 1 }
kann "A" erzeugen und global verfügbar machen
![Page 31: Skriptprogrammierung Tcl/Tk von Manuel Caroli Betreuer: Thorsten Brunklaus](https://reader035.vdocuments.site/reader035/viewer/2022062417/55204d6449795902118ba655/html5/thumbnails/31.jpg)
upvar
• upvar macht Variablen außerhalb des Scopes verfügbar
• makeA mit upvar:proc makeA {} { upvar #0 A a set a 1 }
• #0 bedeutet global
• n bedeutet um n "Ebenen" höher
• default ist 1
• upvar ist also flexibler als global
GlobalA 1... ...
a •makeA
![Page 32: Skriptprogrammierung Tcl/Tk von Manuel Caroli Betreuer: Thorsten Brunklaus](https://reader035.vdocuments.site/reader035/viewer/2022062417/55204d6449795902118ba655/html5/thumbnails/32.jpg)
Beispiel „makeVar“
proc makeVar {trunk init start end scope} {
for {set i $start} {$i <= $end} {incr i} {
upvar [expr $scope+1] $trunk$i a
set a $init
}
}
• Automatisierte Variablenerzeugung
• Pass-by-name
• makeVar a 0 0 10 0 erzeugt a0, ..., a10
![Page 33: Skriptprogrammierung Tcl/Tk von Manuel Caroli Betreuer: Thorsten Brunklaus](https://reader035.vdocuments.site/reader035/viewer/2022062417/55204d6449795902118ba655/html5/thumbnails/33.jpg)
Weitere Kommandos
• „Eingebaute“ Kommandos:
• mathematische Operationen
• Stringmanipulation
• Listen
• Kontrollstrukturen (while, for, foreach)
• Fehlerbehandlung
• Kommentare: #
• „Externe“ Kommandos:• z. B. dir c:\\
![Page 34: Skriptprogrammierung Tcl/Tk von Manuel Caroli Betreuer: Thorsten Brunklaus](https://reader035.vdocuments.site/reader035/viewer/2022062417/55204d6449795902118ba655/html5/thumbnails/34.jpg)
"quoting hell"
if [1 <= 2] {1} {2}
invalid command name "1"
if {1 <= 2} {1} {2}
invalid command name "1"
• 1. Zeile:• Auswertung von [1 <= 2]
• erwartet dass 1 ein Kommando ist
• 2. Zeile:• Test erfolgreich zu „true“ ausgewertet
• erwartet dass {1} ein Kommando ist
![Page 35: Skriptprogrammierung Tcl/Tk von Manuel Caroli Betreuer: Thorsten Brunklaus](https://reader035.vdocuments.site/reader035/viewer/2022062417/55204d6449795902118ba655/html5/thumbnails/35.jpg)
Tk – Toolkit
• Erweitert Tcl um GUI
• „Windowing Shell“: wish
• Widgets• vorgefertigte grafische Elemente
• Geometriemanager• Steuert die Anzeige von Widgets
• Event-Management
![Page 36: Skriptprogrammierung Tcl/Tk von Manuel Caroli Betreuer: Thorsten Brunklaus](https://reader035.vdocuments.site/reader035/viewer/2022062417/55204d6449795902118ba655/html5/thumbnails/36.jpg)
Widgets
• UI-Komponenten• Buttons
• Menüs
• Listboxes
• etc.
• Namen: hierarchisch• . main widget
• .a.b : widget b ist „Kind“ von .a, ist „Kind“ von .
• Widgetname ist zugleich Kommando
![Page 37: Skriptprogrammierung Tcl/Tk von Manuel Caroli Betreuer: Thorsten Brunklaus](https://reader035.vdocuments.site/reader035/viewer/2022062417/55204d6449795902118ba655/html5/thumbnails/37.jpg)
Geometriemanager
• Packer Standard-Geometriemanager in Tk
• Ordnet Widgets an
• Passt die Größe von Widgets an
• Kommando pack
• Filling & Padding
pack .ok .cancel .help -side left \ -padx 2m -pady 1m -fill y
![Page 38: Skriptprogrammierung Tcl/Tk von Manuel Caroli Betreuer: Thorsten Brunklaus](https://reader035.vdocuments.site/reader035/viewer/2022062417/55204d6449795902118ba655/html5/thumbnails/38.jpg)
Widgets - Beispiel
button .top -text "Top button"
pack .top
button .bottom -text "Bottom button"
pack .bottom
• button erzeugt Buttons
• pack macht Widgets (hier: Buttons) sichtbar
• Neues Kommando .top:
.top configure -relief sunken
![Page 39: Skriptprogrammierung Tcl/Tk von Manuel Caroli Betreuer: Thorsten Brunklaus](https://reader035.vdocuments.site/reader035/viewer/2022062417/55204d6449795902118ba655/html5/thumbnails/39.jpg)
Geometriemanager (2)
• Placer alternativer Geometriemanager in Tk
• Anordnung der Widgets manuell
• Maße der Widgets manuell
• Kommando place
button .b -text "OK"
place .b -x 10 -y 10 -width 100
![Page 40: Skriptprogrammierung Tcl/Tk von Manuel Caroli Betreuer: Thorsten Brunklaus](https://reader035.vdocuments.site/reader035/viewer/2022062417/55204d6449795902118ba655/html5/thumbnails/40.jpg)
Event Management: bind
bind .b <Button-1> {...}
bind . <Any-KeyPress> {puts "Taste %K"}
bind all <Motion>
{puts "Mausposition (%x,%y)"}
• „Binden“ von events wie <Button-1> an entsprechende Reaktionen
• Mehrere zeitgleich auftretende Events werden automatisch abgearbeitet
![Page 41: Skriptprogrammierung Tcl/Tk von Manuel Caroli Betreuer: Thorsten Brunklaus](https://reader035.vdocuments.site/reader035/viewer/2022062417/55204d6449795902118ba655/html5/thumbnails/41.jpg)
Canvas
• Container-Widget für Grafische Primitive• Rechtecke, Kreise, Linien, etc.
• Erzeugte Objekte ansteuerbar wie Widgets
• Beispiel:pack [canvas .c]
.c create oval 1c 1c 4c 4c -fill red
![Page 42: Skriptprogrammierung Tcl/Tk von Manuel Caroli Betreuer: Thorsten Brunklaus](https://reader035.vdocuments.site/reader035/viewer/2022062417/55204d6449795902118ba655/html5/thumbnails/42.jpg)
Gruppierung von Objekten
• Jedes Obekt kann Marken (Tags) haben
• Mehr als eine Marke erlaubt Hierarchische Gruppierung
• Option -tag
• Steuerung über diese Marken
• Kommandos werden für alle Objekte mit dieser Marke ausgeführt
• Beispiel:
pack [canvas .c]
.c create oval 1c 1c 2c 2c -tag Kreis
.c create oval 2c 2c 3c 3c -tag Kreis
.c itemconfigure Kreis -fill red
![Page 43: Skriptprogrammierung Tcl/Tk von Manuel Caroli Betreuer: Thorsten Brunklaus](https://reader035.vdocuments.site/reader035/viewer/2022062417/55204d6449795902118ba655/html5/thumbnails/43.jpg)
Fazit – Tcl
• Vorteile• sehr flexibel
• einfach
• Nachteile• wird leicht unübersichtlich
• "quoting hell"
• schwierige Fehlersuche
• langsam
![Page 44: Skriptprogrammierung Tcl/Tk von Manuel Caroli Betreuer: Thorsten Brunklaus](https://reader035.vdocuments.site/reader035/viewer/2022062417/55204d6449795902118ba655/html5/thumbnails/44.jpg)
Fazit – Tk
• Vorteile• sehr einfache GUI-Erzeugung
• ebenfalls flexibel
• packer
• Nachteile• langsam
• Erst das Gespann "Tcl/Tk" war erfolgreich
![Page 45: Skriptprogrammierung Tcl/Tk von Manuel Caroli Betreuer: Thorsten Brunklaus](https://reader035.vdocuments.site/reader035/viewer/2022062417/55204d6449795902118ba655/html5/thumbnails/45.jpg)
Quellenangaben
• John K. Ousterhout, Tcl and the Tk Toolkit, Addison-Wesley Professional Computing Series (1994)
• John K. Ousterhout, Tcl: An Embeddable Command Language (USENIX Winter 1990)
• John K. Ousterhout, An X11 Toolkit Based on the Tcl Language (USENIX Winter 1991)
• www.tcl.tk