Tcl/Tk 的起源
Tcl 是“工具控制語言(Tool Control Language)”的縮寫。Tk 是 Tcl“圖形工具箱”的擴展,它提供各種標準的 GUI 接口項,以利於迅速進行高級應用程式開發。John K. Ousterhout於 1988 年開始開發 Tcl/Tk(讀作“tickle tee-kay”),當時其是加州大學伯克利分校(UCB)的教授。Tcl 是以可擴展性、短的學習曲線和易於嵌入為特定目標而設計的。Tk 的開發始於 1989 年,第一個版本於 1991 年問世。Ousterhout 博士在他離開 UCB 之後繼續開發 Tcl/Tk,然後由於工作需要,他去了 Sun Microsystems 公司工作。現在,也就是在寫本文之時,他在 Scriptics(它開發出 Ajuba Solutions,已由 Interwoven 收購)繼續改進該語言,目前的穩定版本是 8.5.13,在寫本文的時候,8.6b3 版本正在開發之中。
工具和檔案
在 Linux 系統上研究 Tcl/Tk,需要有兩個主要程式。它們是 tclsh 和 wish。正如可以從其名稱所辨別的那樣,所以前者是 Tcl 外殼,常用於為外殼腳本提供執行環境。Wish 類似於 tclsh,它是針對視窗化的 GUI 環境。輸入下列命令,檢查這些檔案是否存在:
~/tcltk$ which tclsh/usr/bin/tclsh~/tcltk$ which wish/usr/bin/wish |
Tcl
Tcl(最早稱為“工具命令語言”"Tool Command Language",但是目前已經不是這個含義,不過我們仍然稱呼它為TCL)是一種 腳本語言。由John Ousterhout創建。TCL很好學,功能很強大。TCL經常被用於快速原型開發,腳本編程,GUI和測試等方面。TCL念作“踢叩”(tickle)。Tcl的特性包括:
任何東西都是一條命令,包括語法結構(for,if等)。
任何事物都可以重新定義和重載。
所有的數據類型都可以看作字元串。
語法規則相當簡單。
提供事件驅動給Socket和檔案。基於時間或者用戶定義的事件也可以。
動態的域定義。
很容易用C, C++,或者Java擴展。
解釋語言,代碼能夠動態的改變。
完全的Unicode支持。
平台無關。 Win32, UNIX, Mac上都可以跑。
和GUI緊密集成。 Tk
代碼緊湊,易於維護。
TCL本身在8.6以後提供面向對象的支持。因為語言本身很容易擴展到支持面向對象,所以在8.6之前存在許多C語言擴展提供面向對象能力,包括XOTcl, Incr Tcl等。另外SNIT擴展本身就是用TCL寫的。
使用最廣泛的TCL擴展是TK。 TK提供了各種OS平台下的圖形用戶界面GUI。 Perl、 Python等語言都提供接口適配到TK上。另一個流行的擴展包是 Expect. Expect提供了通過終端自動執行命令的能力,例如(passwd, ftp, telnet等命令驅動的外殼).
擴充套件
Tcl支援擴充套件,這些擴充套件提供了額外的功能(像是GUI,自動化,資料庫存取等)。下面是一些Tcl擴充套件的列表:
tclodbc
mk4tcl
sqlite
Pgtcl, pgintcl
mysqltcl, msqltcl
AdabasTcl
FBSQL
ibtcl
Oratcl
Sybtcl
db2tcl
以及還有更多、更多 - 請參考Tcl/Tk Wiki,特別是Tcl/Tk Wiki Database Category。
範例
下面是TCL程式的例子:#!/bin/sh # next line restarts using tclsh in path \ exec tclsh $0 ${1"$@"} # echo server that can handle multiple # simultaneous connections. proc newConnection { sock addr port } { # client connections will be handled in # line-buffered, non-blocking mode fconfigure $sock -blocking no -buffering line # call handleData when socket is readable fileevent $sock readable [ list handleData $sock ] } proc handleData { sock } { puts $sock [ gets $sock ] if { [ eof $sock ] } { close $sock } } # handle all connections to port given # as argument when server was invoked # by calling newConnection set port [ lindex $argv 0 ] socket -server newConnection $port # enter the event loop by waiting # on a dummy variable that is otherwise # unused. vwait forever 另外一個TK的例子(來自A simple A/D clock)它使用了定時器時間,3行就顯示了一個時鐘。
proc every {ms body} {eval $body; after $ms [info level 0]} pack [label .clock -textvar time] every 1000 {set ::time [clock format [clock sec] -format %H:%M:%S]} ;# RS 解釋:第一行定義了過程every, 每隔ms毫秒,就重新執行body代碼。第二行創建了標籤其內容由time變數決定。第3行中設定定時器,time變數從當前時間中每秒更新一次。
tcl/tk是python等語言默認的圖形界面.