360 likes | 947 Views
Tcl/Tk: An introduction. D. Kim, K. Kundu, and M. Siegel November 26, 2002 CMSC 631. Tcl ( Tool Control Language ) history. Developed in late 1980s by John Ousterhout at UC Berkeley Created as a single language used to control IC tools, rather than use a different language for each one.
E N D
Tcl/Tk: An introduction D. Kim, K. Kundu, and M. Siegel November 26, 2002 CMSC 631
Tcl (Tool Control Language) history • Developed in late 1980s by John Ousterhout at UC Berkeley • Created as a single language used to control IC tools, rather than use a different language for each one. • Provides for extensions such as Tk (GUI), [incr Tcl] (OOP), etc. Tcl/Tk: An Introduction
Timeline of Tcl 1. Tcl created as general-purpose command/scripting language by John Ousterhout 7. ActiveState introduces Tcl support and services • 4. Scriptics formed: • Evolve and extend Tcl platform • Create development tools 6.0 Sept 7.0 Sept 7.4 July 7.6 Oct 8.0 Aug 8.1 Apr 8.3 Feb … 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 8.2 Aug • 2. Open source distributions • from U.C. Berkeley: • Easy GUIs under Unix • Extensible applications • 3. Tcl enhanced at Sun Microsystems: • Windows, Macintosh ports • Web/Internet support • Java support Tcl/Tk: An Introduction Slide courtesy of ActiveState
Installing Tcl/Tk • Windows/Mac: Latest distribution maintained by ActiveState (ActiveTcl 8.4.1.0). Download at http://www.tcl.tk/ • Unix/Linux: Tcl/Tk is included with most Unix/Linux distributions Tcl/Tk: An Introduction
3 Ways to Use Tcl/Tk • tclsh for interactive use $tclsh %puts “I am using tclsh” I am using tclsh • wish for programs using the Tk package • Embed in C program with <tcl.h> Tcl/Tk: An Introduction
Basics • Tcl script = • Sequence of commands. • Tcl command = • One or more words separated by white space. • First word is command name, others are arguments. • Returns string result. • Example: • set a 22set b 33 Tcl/Tk: An Introduction
[ ] and $ substitution • Substitutions: • variable substitution: set id 631 puts “This class is CMSC $id” • command substitution, evaluated as separate script: set b [expr $id*4] Tcl/Tk: An Introduction
Math Evaluation • expr command evaluates expressions. Sample commandResult set b 5 5 expr ($b*4)-3 17 expr $b <= 2 0 • Many other math functions included, such as sin, cos, sqrt, and log. Tcl/Tk: An Introduction
Conditional/Looping Statements • Like most languages, Tcl supports an if statement, though the keywords then and else are optional. • For loop: • for {set a 0} {$a < 100} {incr a} { #more code here } • While loop is also supported Tcl/Tk: An Introduction
Tcl lists • list are ordered collections of elements • any proper list can also be a Tcl command (eval) • concat list list – concatenate lists concat {a b c} {d e f} a b c d e f • join list sep – convert to string with separator join {a b c} ", " a, b, c • Some list functions: lappend lindex, linsert, llength, lrange Tcl/Tk: An Introduction
Tcl Arrays • Tcl arrays are 'associative arrays': index is any string • set nicholas(1) 331 • set nicholas(2) [expr $nicholas(1) + 300] • array names nicholas • Matricies can be “faked” with index notation: • set A(1,1) 10 • set A(1,2) 11 • array names A => 1,1 1,2(commas included in names!) Tcl/Tk: An Introduction
Regular Expressions • Tcl has full support for regular expression pattern matching and substitution • regexp command for matching, places matched chars into variable specified • regsub for substitution Tcl/Tk: An Introduction
Tk : An Introduction • Tk is a Toolkit for programmable user interfaces. • Tk provides a set of Tcl commands that create and manipulate widgets. • John Ousterhout began work on Tk in late 1988; finished in 1990. • Tk's GUI facilities were both very simple and very powerful. Tcl/Tk: An Introduction
Tk : Widgets • A widget is window in a GUI with particular appearance and behavior. • Widget types include buttons, scrollbars, menus, and text windows. • Tk also has a general purpose drawing widget called a canvas that lets you create lightweight items such as lines, boxes and bitmaps. Tcl/Tk: An Introduction
Tk : Widgets (Con’t) • Tk widgets organized in a hierarchy. - children windows inside a parent window • Parent widgets use frame widgets to lay the children windows out • Can create complex windowing schemes using Tk widget hierarchy. Tcl/Tk: An Introduction
Tk : Geometry Manager • Widgets are under the control of geometry manager that controls their size and location on the screen • Until the GM learns about a widget, it is not mapped onto a screen • Types of Geometry Managers: • The Pack GM • The Grid GM • The Place GM Tcl/Tk: An Introduction
Tk : A Small Example #!/usr/local/bin/wish button .hello -text Hello -command {puts stdout "Hello World!"} pack .hello -padx 20 -pady 10 (code courtesy of Practical Programming in Tcl and Tk by Brent B. Welch) Tcl/Tk: An Introduction
Tk : Events • Tk-based application has event-driven control flow. • Usually Tk widgets handle most events automatically. • For specialized behavior, bind command is used. Tcl/Tk: An Introduction
Tk : Events (Con’t) • Examples of events include mouse motion, mouse clicks, keystrokes, window resizing, window destruction • Virtual events like cut and paste are also possible. • Event bindings grouped into classes called bindtags which are associated with a class. • Focusing on windows helps switch bindtags. Tcl/Tk: An Introduction
Example – diff command #!/usr/bin/wish # Description : # this program will give the user a graphical interface to the Unix # command "diff". The window will allow the user to specify a pair # of files to check for differences and a few options, as well as # colorizing the output appropriately # title wm title . tkdiff Tcl/Tk: An Introduction
Example: (Con’t) # frame for the first file frame .first -borderwidth 1 label .first.name1 -text "Filename 1:" -foreground red entry .first.ent1 -width 68 -relief sunken \ -textvariable name1 pack .first.name1 -side left pack .first.ent1 -side left -fill x -expand true Tcl/Tk: An Introduction
Example: (Con’t) # frame for the second file frame .second -borderwidth 0 label .second.name2 -text "Filename 2:" -foreground blue entry .second.ent2 -width 68 -relief sunken \ -textvariable name2 pack .second.name2 -side left pack .second.ent2 –side left -fill x -expand true pack .first .second -fill both Tcl/Tk: An Introduction
Example: (Con’t) # frame for check boxes set third [frame .third -borderwidth 2] checkbutton $third.1 -text "Ignore Case Changes" \ -variable cFlag checkbutton $third.2 -text "Ignore Whitespace Diffs" \ -variable wFlag pack $third.1 $third.2 -side left pack $third -fill x Tcl/Tk: An Introduction
Example: (Con’t) # frame for command buttons set fourth [frame .four -borderwidth 2] button $fourth.1 -text Quit -command Exit $fourth.1 config -activebackground red button $fourth.2 -text Go -command Run $fourth.2 config -activebackground green button $fourth.3 -text Clear -command Clear $fourth.3 config -activebackground blue pack $fourth.1 $fourth.2 $fourth.3 -side left pack $fourth Tcl/Tk: An Introduction
Example: (Con’t) # frame for display area frame .msg -borderwidth 2 set box [text .msg.box -width 60 -height 10 \ -borderwidth 1 -relief raised -setgrid true \ -yscrollcommand {.msg.yscroll set} \ -xscrollcommand {.msg.xscroll set}] scrollbar .msg.yscroll -command {.msg.box yview} \ -orient vertical scrollbar .msg.xscroll -command {.msg.box xview} \ -orient horizontal pack .msg.yscroll -side right -fill y pack .msg.xscroll -side bottom -fill x pack .msg.box -side left -fill both -expand true pack .msg -side top -fill both -expand true Tcl/Tk: An Introduction
Example: (Con’t) # for change colars .msg.box tag configure TagA -foreground red .msg.box tag configure TagB -foreground blue # when user click exit button proc Exit {} { set picked [tk_messageBox -type yesno \ -message "Really Quit?" \ -default no \ -icon question] if {$picked == "yes"} { exit } } Tcl/Tk: An Introduction
Example: (Con’t) # when user click go button proc Run {} { global box name1 name2 cFlag wFlag input if {$wFlag == 1 && $cFlag == 1} { set cmd "diff $name1 $name2 -c -w" } elseif {$wFlag == 1 && $cFlag == 0} { set cmd "diff $name1 $name2 -w" } elseif {$wFlag == 0 && $cFlag == 1} { set cmd "diff $name1 $name2 -c" } else { set cmd "diff $name1 $name2“ } if [catch {open "|$cmd |& cat"} input] { $box insert end $input\n } else { fileevent $input readable Log $box insert end $cmd\n } } Tcl/Tk: An Introduction
Example: (Con’t) # function for write a log to display area proc Log {} { global input box if [eof $input] { Stop } else { gets $input line if [regexp "^<" $line matches] { $box insert end $line\n TagA } elseif [regexp "^>" $line matches] { $box insert end $line\n TagB } else { $box insert end $line\n } $box see end } } Tcl/Tk: An Introduction
Example: (Con’t) # when input file is end of file proc Stop {} { global input box catch {close $input} } # clear the display area proc Clear {} { global box $box delete 1.0 end } Tcl/Tk: An Introduction
Example: Run Tcl/Tk: An Introduction
Example: Output Tcl/Tk: An Introduction