Summary edit
Richard Suchenwirth 2002-04-30 - Before knowing of Arjen Markus's A simple slideshow, I decided that a presentation about Tcl/Tk should be done in Tcl/Tk.Here is my version which uses a canvas and can also produce Postscript of the pages (text in German, sorry, but that's what I wrote it for).iShow is a much simplified version later variation of this.
Code edit
set pages {
{{Tcl/Tk in der Praxis} {
.
. Richard Suchenwirth, Siemens Dematic PA RC D2
. 2002-04-30
}}
{{Tcl/Tk in der Praxis} {
+ Tcl: "Tool Command Language"
. Open Source: freie Software (BSD-Lizenz)
+ Scripting mit Tcl: plattformunabhängig Mac/Unix/Windows..
+ Programmierung in Tcl
. Aufbau komplexer Anwendungen möglich
+ UI-Programmierung in Tk ("ToolKit")
}}
{{Scripting mit Tcl} {
+ typischerweise auf eine Quelldatei beschränkt
. Argumente des Aufrufs in argv, Name des Scripts in argv0
+ Direkt ausführbare Skripte (executable file)
+ Aufruf von externen Programmen mit exec/open
+ Environment in Array ::env abgebildet
+ Viele externe Programme (sed, awk) intern ersetzbar
+ Kontrollstrukturen: if, while, foreach, for
}}
{{Kleine Tcl-Beispiele} {
+ Filter (liest stdin, schreibt stdout)
> while {[gets stdin line]>=0} {
> # irgendeine Verarbeitung des Inputs, z.B.
> set line [string toupper $line]
> puts stdout $line
> }
+ Iteration über Dateien: Größensumme in Bytes
> set sum 0
> foreach i [glob *] {incr sum [file size $i]}
> puts "Total size: $sum Bytes"
}}
{{Programmierung mit Tcl} {
+ kein Gegensatz zu Scripting, eher gleitender Übergang
+ Code typischerweise in Prozeduren organisiert
+ Libraries: Code auf mehrere Files (autoload, package) verteilt
. Libraries mit Selbsttest-Code (empfohlen)
+ Strukturierung von Variablen- u. Prozedurnamen mit Namespaces
+ Erweiterbarkeit mit C/C++-Libraries
}}
{{GUI-Programmierung mit Tk} {
+ Widgets: label, *button, menu, listbox, text, canvas ...
+ Geometrie-Manager: pack, grid, place
+ Bindings: Ereignisse (Maus, Tastatur) an Widgets
+ Event-Modell
}}
{{Beispiel: Editor mit Scrollbars} {
> #---------------------------------- Widgets anlegen
> text .t -xscrollcommand ".x set" -yscrollcommand ".y set"
> scrollbar .x -command ".t xview" -ori hori
> scrollbar .y -command ".t yview" -ori vert
> #---------------------------------- Widgets managen
> grid .t .y -sticky news
> grid .x -sticky ew
> #------------------- Gewichte für Größenveränderung
> grid rowconf . 0 -weight 1
> grid columnconf . 0 -weight 1
}}
{{Beispiel: diese Präsentation} {
+ Diese Präsentation ist ein Tcl/Tk Script in 117 Zeilen
. davon ca. 50 Programmcode, 70 Zeilen Daten
+ Canvas-Widget
. Items der Typen 'text', 'line' und 'oval'
+ Folien können als Postscript-Files erzeugt werden.
}}
}
namespace eval present {set version 0.1}
proc present::go {w Pages} {
variable pages $Pages npage 0 fonts
array set fonts {
h1 {Times 36}
h2 {Times 24}
body {Times 18}
pre {Courier 18}
}
focus -force $w
bind $w <1> {incr present::npage; present::page %W}
bind $w <3> {incr present::npage -1; present::page %W}
bind $w <space> {incr present::npage; present::page %W}
bind $w p {%W postscript -file p$present::npage.ps -rotate 1}
present::page $w
}
proc present::bullet {w x y} {
$w create oval [expr $x-20] [expr $y-5] [expr $x-10] [expr $y+5] -fill black
}
proc present::page w {
variable pages; variable npage
variable fonts
set maxpages [llength $pages]
set npage [expr {$npage<0? 0: $npage>=$maxpages? $maxpages-1: $npage}]
wm title . "$::script $npage"
$w delete all
foreach {title body} [lindex $pages $npage] break
set x 50; set y 50
$w create text $x $y -anchor w -text $title -font $fonts(h1) -fill blue
$w create line $x [expr $y+30] 32000 [expr $y+30] -width 3 -fill red
incr y 40
foreach line [split $body \n] {
set line [string trim $line]
switch -- [string index $line 0] {
> {set font $fonts(pre)}
+ {set font $fonts(h2);bullet $w $x $y}
default {set font $fonts(body)}
}
$w create text $x $y -anchor w -text [string range $line 2 end] -font $font
incr y 40
}
}
if {[file tail [info script]]==[file tail $argv0]} {
pack [canvas .c -bg white -width 800 -height 600] -fill both -expand 1
set ::script [wm title .]
present::go .c $pages
}
