45
Skriptprogrammi erung Tcl/Tk von Manuel Caroli Betreuer: Thorsten Brunklaus

Skriptprogrammierung Tcl/Tk von Manuel Caroli Betreuer: Thorsten Brunklaus

  • Upload
    yuri

  • View
    27

  • Download
    3

Embed Size (px)

DESCRIPTION

Skriptprogrammierung Tcl/Tk von Manuel Caroli Betreuer: Thorsten Brunklaus. 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 - PowerPoint PPT Presentation

Citation preview

Page 1: Skriptprogrammierung Tcl/Tk von Manuel Caroli Betreuer: Thorsten Brunklaus

Skriptprogrammierung

Tcl/Tk

von

Manuel Caroli

Betreuer:Thorsten Brunklaus

Page 2: Skriptprogrammierung Tcl/Tk von Manuel Caroli Betreuer: Thorsten Brunklaus

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

"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

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

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

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

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

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

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

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

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

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

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

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