Tcl/Tk的一些筆記

Tcl/Tk的一些筆記

                                      

快速圖形界面開發語言Tcl/Tk
0.前言.在unix like系統下,有沒有像VB一樣的快速圖象界面開發工
具呢?很多人大概馬上會想到Kylix,基於Java的一些圖形開發工具
。但是數百兆的安裝大小對於一些簡單用途是否小題大做了呢?其實,
很多腳本語言如Perl,Python本身就已經包含Tk庫,可以用來建構圖
形界面。不過,這些也都是數十兆的軟件包,圖形也並非主要用途,Tk
庫往往不是缺省就包含的。那麼設想有這樣一種工具,它可以逐行運
行,即時顯示圖象效果和事件驅動效果,擁有簡單的語法提示,又可
簡單的回溯修改,系統不過數兆,除命令行外還擁有簡單的類似VB,Kylix
的窗口界面開發工具,可以簡單移植到各種軟件平臺,包括Palm掌上
電腦,軟件不需要一行修改,你會考慮使用它嗎?
在你的X Window界面下的Xterm裏面輸入wish,或者xwish,wish80,tix
等,有相當大概率會出現一個控制檯和一個空白的窗口,恭喜,在你
不知道的時候,您已經擁有了它。

1.特點Tk是一套在Unix like,Mac,Windows下可移植的快速圖形開發
工具ToolKit的縮寫。它有多種語言界面,如C,Perl,Python等。而其
中其中常見也最方便短小的界面語言是Tcl。Tcl/Tk在有X window的unix
 like系統下基本是缺省配置,在windows下的wrapper也不過幾百k。
相對於其他圖形界面開發語言來說實在是短小精悍。通過Visual Tcl,
你可以獲得如同Visual Basic一樣簡單的快速開發能力。而Visual Tcl
這樣一個強大的工具本身全部均爲Tcl/Tk寫成,大小不過數兆,可見
它的能力和容易程度。
它的缺點是:Tcl語言是一種幾乎沒有數據類型的語言!這是短小、
可移植帶來的代價。它是一種幾乎只用list作數據類型的語言,構造
十分精巧,寫起它的語法解釋程序時很簡單。反過來,在寫應用程序
時面對複雜的控制和計算有點麻煩(但是仍然能夠解決,而且也不是
他的設計目的)。本文在此僅爲介紹,細節請自己閱讀mannual。相
關章節是n,例man n entry。
windows下的tcl/tk手冊爲一個HLP文件。
Tcl一個著名的擴展就是expect,可以作用來自動連接telnet等script
無法處理的智能應答工作。
Tcl/Tk的基本系統窗口類型比較少,常見的擴展有Tix,和麪向對象的
版本itcl/itk(incr Tcl)。兩者已包含在大多數Tcl/Tk系統中。
Tcl/Tk可以通過裝載package來擴展命令和窗口類型。
可以通過下載別人寫好的package,自己編寫package,或者將Tcl/Tk
嵌入到C來完成複雜任務。
2。需求與安裝、運行在unix like系統(Sun,Linux)下,Tcl/Tk需
要X支持(廢話),但是Tcl本身不需要。在Mac、Windows下,需要安
裝Tcl/Tk的移植版本。可以在http://dev.scriptics.com下載,最新
版本在8.3左右(2003年初)。您也許還需要Visual Tcl工具包,可
以在同一網址下載,它需要最新版本的Tcl/Tk支持。windows下全部
開發系統下載約5.2M,其中tcl/tk 2.5M(含手冊,C調用Tcl/Tk的頭
文件,庫文件),Visual Tcl 2.9M。相對於Tk的C開發包龐大的身材
(當然也對應強大的功能),在簡單的窗口開發中您也可以考慮採取C
內嵌Tcl/Tk的開發模式。
安裝時Mac/Windows直接運行安裝程序。
unix like系統下Tcl/Tk一般作爲一個部件在安裝X Window同時就裝
好了(因爲很小),沒有安裝的情況下也有rpm,binary.gz等包可以
安裝。
windows下unix仿真程序cygwin32系統裏面也包含Tcl/Tk。
運行Tcl語言的命令行程序名爲tclsh,也許包含軟件版本,如tclsh83
。cygwin裏面的爲cygtclsh83.exe。
運行Tk圖形界面的命令爲wish,同樣可能包含數字後綴或者其他前綴

Tix,itcl,itk的命令行程序名分別是tix,itclsh,itkwish。
如果執行命令找不到而軟件已安裝,請將包含上述命令的路徑包含到
您的path變量裏面。
in unix(~/.profile)加入如下行: set path=$path:/local/bin/tcl/
 (缺省不需要,因爲就在X目錄或者/bin裏面就有)in windows(autoexec.bat)
加入如下行:    path %path%;"c:Program FilesTclBin"具體目
錄名在此僅爲舉例,不一定和您安裝的目錄一致,請自己修改。
Tcl可以被編譯(須購買相應軟件,可以提高運行速度),或者在windows
下直接wrap成一個獨立運行的可執行文件(使用Visual Tcl工具包裏
面的freewrap objectfile.tcl)。在普通模式下tcl在運行時也被編
譯爲機器無關的bytecode,不過你不需要知道細節。
3.Tcl簡介
3.1 基礎
Tcl語句爲 Command [-option1 value1 [-option2 value2...]  arg1 [arg2 arg3...]
在控制檯輸入命令後回車,命令即被執行並打
印當前命令的返回值。當一行寫不下時可用續行,欲在一行包含多個語句可用;分開。
比如exec ls *.cTcl裏面基本只有四種數據類型:簡單字符串,數組,
表,變量。而字符串可以看作表的最基本單位,變量可以看作系統數
組裏面以變量名爲下標的字符串。平常所用的變量,命令等全部是字符串。
變量可以用variable來定義,通過set來賦值,unset來消除。變量用$
開頭。
set a "this is good"
將$a賦值爲"this is good"
set a [expr 3+$b]
此命令將3+$b的結果賦值給$a。
不帶第二個參數將返回$a的值因爲Tcl
裏面沒有數字類型,必須用expr來求字符串表達式的數學運算。
[]表示將括號內的表達式求值。在Tcl裏面要使用命令的結果作爲另一個命令的參數,就要用[]。

{}和()在Tcl裏面已經有其他含義。
數組(或者說哈希表hash table)的下標是表(list),或者最簡單的表:
不含空格和特殊字符的字符串,下標用()表示。
它可以用array來定義。
set ms(haha) a
set b ms
set c haha
則$b($c)的值爲a。
變量或者數組無需定義即可使用,不過第一次使用時必須賦值。
表包含0到多個元素。
set a "this is a pen"
set b {this is a pen}a和b是等價的。
a的第一個元素是this,第二個是is,餘下依次類推。
如果沒有界定符,缺省界定符是空格,即set a "asdfg"和set a  {asdfg}
和set a asdfg是等價的。
set a this返回只有一個元素this的表$a,或者說簡單字符串$a。
表可以是空表set a ""set b {}表的元素也可以是表,空表和沒有元
素是不同的如{a}不同於{a {}},{}不同於{{}}。
set a {this is a list {a b c}}則表的第5個元素是{a b c}
可以用lindex a n
來取得a的第n+1個元素,n必須爲數字。因爲元素位置是從0開始的。
比如lindex a 4返回{a b c}linsert a index元素1元素2...返回在
在表a的位置index處插入元素後的新表,注意a是變量的情況下表a本
身沒有變化。
set a [linsert $a 2 not]將$a變爲{this is not a list {a b c}},
如果漏了$,則$a爲{a not}。僅linsert $a 2 not命令不會改變$a。
表的其他操作命令爲lappend list llength lrange lreplace lsearch
 lsort,具體請參看手冊。
set ms() heihei其實是將ms({})賦值爲heihei。
數組的下標還可以是{a {b c}}等複雜形式,雖然我們平時最好不要
這麼用。
如果需要二維數組,可以使用set array($a,$b) value的變通形式,
雖然其實數組其實是下標爲"$a,$b"的字符串組成的一維數組,但是
大多數情況下可行。

""和{}的區別是是否作代換。
""內對變量$和作變換而{}保持不變。
試執行set a coolputs "$a haha "(返回cool haha回車)
和set a coolputs {$a haha } (返回$a haha 原樣的結果)
, , ,$,/等含義同C語言和shell。
puts是打印結果的命令,當第一個參數代表文件時輸出到文件(channel)。
對應爲gets channel ?varName?注意和puts不同,gets必須帶文件參數
3。2流程控制if語句if expression {statement} ?else {statement2}?expression
爲一簡單字符串或返回簡單字符串的[語句*****]調用,{}內爲執行的語句,類型爲
一個表,else部分可選。
爲了語法的美觀,當目前行遺留有未配對的{或者"作用時,回車換行
不代表語句結束,這對於所有的表均成立。
set a 3if $a>0&&$a<5 {puts $aincr a}expression用法類似於C語
言。
incr a返回$a代表的數字加一,$a本身產生變化。
for語句for {start} {expression} {next} {statement}例如for {set
 i 0} {$i<5} {incr i} {puts $i}注意if裏面的判斷可以不用{},
但是for裏面的就必須用,因爲if裏面只判斷一次,而如果for裏面不
用{},則判斷語句在第一次解析時就已經決定,以後不再變化。在上
例中就是永遠返回第一次的值"0<5",循環不會結束了……注意這也
是大多數使用{}而非""的原因,即不希望立刻被語法解析。
foreach a {aa bb cc} {puts $a}返回aabbcc該命令依次將variable
代換爲列表元素並執行
其他還有while break continue等語句,用法均類似C。
switch命令用法不同。
switch string pattern1 {expression1} pattern2 {expression2}
當string符合pattern時返回對應的expression值多行寫法switch 
 xyz {  a               -       b               {               # Correct Comment Placement             format 1        }       a*              {format
 2}     default         {format 3}}注意因爲是返回表達式,在此不需要C語
言裏面的break語句。
該語句可以帶-regex選項匹配正則表達式。
函數proc name args body  例set ss "aa"proc newcmd {a b c} {upvar
 $ss dglobal ssputs "$d is $b $d"set $ss areturn $c}注意如果
不用upvar重命名或者global指出爲全局變量,子程序不能直接用上
級或者全局變量
3。3字符串和文件處理format命令類似於printf語句的輸出風格set
 a 1format "%03d haha " $a返回"001 haha "這個字符串對字符
串的其他處理用string命令string bytelength $a取$a按byte計算的
長度(因爲string可能不是英文)
string compare ,string equal,string first,string index,string
 is,string last,string length,string map,string match等命
令自己查mannual。
如果沒有手冊,可以使用tcl語言的模糊查找功能。
只要不引起歧義,命令名可以只輸入一部分。如果有歧義,tcl會告
訴你匹配的命令列表。
輸入命令時,如果參數或者子命令錯誤,通常會告訴你可以使用的參
數或者子命令列表輸入string atcl輸出錯誤信息bad option "a": must
 be compare, first, index, last, length, match, range, tolower,
 toupper, trim, trimleft, trimright, wordend, or wordstart輸
入stringtcl輸出錯誤信息wrong # args: should be "string option
 arg ?arg ...?"輸入stcl輸出錯誤信息,包含所有s開頭的命令ambiguous
 command name "s": scale scan scrollbar seek selection set socket
 source split string subst switch輸入?Tcl給出所有可用命令
獲得系統時間用clock命令clock current 獲得當前時間(數字表示)
clock format [clock current]獲得當前時間(字符串表示)
捕獲錯誤catch {script}當出錯時返回一個非0值。用此命令可以防
止因爲局部錯誤退出整個程序。

3。4系統命令和eval在tcksh裏面可以直接執行系統命令,如dir,ls,pwd
等。注意在作爲腳本執行時這是不正規的,也無法在[]內解析。
這時應該用exec syscommand args args來執行eval可以按tcl語法解
析字符串,因爲tcl語言對語句僅解析一遍,當使用glob等返回匹配
列表的命令時很有用。
set ll [glob *.tcl]返回{a.tcl b.tcl c.tcl}雖然puts $ll顯示a.tcl
 b.tcl c.tcl但是exec ls $ll時卻出錯,因爲這相當於執行exec ls
 {a.tcl b.tcl c.tcl}而不是exec ls a.tcl b.tcl c.tcl此時應該
用eval exec ls $ll對文件和目錄的操作(內容讀寫除外)和獲得狀
態,大部分使用file命令,它的子命令爲atime, attributes, copy,
 delete, dirname, executable, exists, extension, isdirectory,
 isfile, join, lstat, mtime, mkdir, nativename, owned, pathtype,
 readable, readlink, rename, rootname, size, split, stat, tail,
 type, volumes, or writable大部分可直接望文生義。
pwd和cd是tcl的內建命令。
3。5文件輸入輸出類似C語言set f [open $filename w]puts $f "haha"close
 $f將haha寫進$filename爲名的文件。
open的方式爲w寫r讀a添加+同時可讀寫的組合。
set a [gets $f]讀一行set a [read $f]全部set a [read $f 300]
讀300字節eof $f返回$f是否已經結束tell $f當前位置seek $f 100
 start/current/end文件位置移動到開始/當前/結尾100字節後處。
3。6雜項執行其他tcl文件用source文件名命令。
載入庫文件使用package require pkg_asdf 命令,package其他子命
令爲forget, ifneeded, names, provide, require, unknown, vcompare,
 versions, or vsatisfies爲了防止庫文件命令和本程序名字衝突,
庫一般使用namespace命令創建新命名空間。庫帶有版本控制。
例如,Http庫內的函數調用方法爲::http::config類似於C++的寫法,
一般最前面的::可以省略,直接寫成http::config如果是載入動態鏈
接庫(unix下的.so或者windows下的dll文件)裏面的命令和變量,使
用load文件名。
如果寫較爲複雜的可重用程序,可以考慮使用itcl,面向對象的tcl
語言,它支持繼承,重載,屬性,方法,私有屬性等。

4。Tk簡介運行wish程序,出現一個控制檯(console)和一個最高層
窗口(toplevel)。
試在控制檯執行以下程序button .b1 -text "Hello! World!" -command
 {destroy .b1}pack .b1然後點擊出現的窗口。恭喜,你已經建立了
一個GUI的程序。
窗口的名字有如下形式.window1.window2.windows3.....最高層窗口
的名字是".",它包含的子窗口都帶有".a",".b",".c"的形式。如果.a
是一個frame等可以包含下級窗口的窗口。則它裏面的窗口則有".a.s1",".a.s2"
的形式。它稱爲pathName,其名字反映了層次關係。
常用窗口有button,entry,radiobutton,checkbutton,frame,listbox,text,canvas,label
等。
4。1創建button pathName ?options? 定義一個名爲pathname的button
窗口,帶有options等性質。同時創建了一個同名的命令,用來執行
和這個窗口相關的操作。
button 的性質有-activebackground -cursor -highlightthickness     -takefocus-activeforeground     -disabledforeground     -image  -text-anchor    -font   -justify        -textvariable-background        -foreground     -padx   -underline-bitmap      
-highlightbackground    -pady   -wraplength-borderwidth -highlightcolor -relief
其中text是按鈕上的文字,command是被按下時執行的命令。
background(可縮寫成bg)和foreground是按鈕的背景和字體顏色顏
色可以是X定義的顏色字符串,如red,blue,yellow,或者#99c,#9934FF,#999001023
形式的十六進制字符串,數字必須爲依次爲紅,綠,藍三個等長的數
字。類似於html裏面的定義方法。
font是字體,用font create創建,font configure配置font create
 bigunder -size 20 -family {Ms Gothic} -underline 1它的可選
屬性爲-family, -size, -weight, -slant, -underline, or -overstrike,
分別對應名稱,大小,是否有粗體,斜體,下劃,上劃線性質。
-relief是3D類型,值爲raised, sunken, flat, ridge, solid, and
 groove,分別爲凸起,凹陷,平,邊框凸起,平邊框,邊框凹陷.
entry 爲輸入字符串的窗口-background      -highlightbackground    -insertontime   -selectforeground-borderwidth   -highlightcolor -insertwidth    -takefocus-cursor       -highlightthickness     -justify        -textvariable-exportselection  
-insertbackground       -relief -xscrollcommand-font    -insertborderwidth      -selectbackground-foreground    -insertofftime  -selectborderwidthtextvariable
指定的變量就是輸入的字符串,可讀也可寫在wish的控制檯輸入entry
 .e -textvariable as(注意和incr,set一樣,此處定義不用$)
pack .e然後裏面輸入幾個字符puts $as看看$as是否如同輸入set $as
 aaa看看entry裏面的字符是否隨之變化。
如果窗口建立後發現屬性設置錯誤,可以用pathname configure -option
 value來改正。
例輸入.e conf 返回.e的全部屬性列表,每個屬性列表分別包含參數
名,屬性名,所屬類,缺省值,當前值。
.e conf -fg blue輸入框裏面的字體變成藍色。
4。2安放前面定義一個窗口後立刻使用pack .pathname ?-options?,
這是因爲剛定義時窗口還沒有安放到上級窗口裏面,這個時候是不可
見的。
-after other排在某同級窗口後面-anchor anchor值爲n,s,e,w或其
組合sw,se,nw,ne。e,s,w,n分別指東南西北,也就是左上右下-before
 other-expand boolean boolen爲1或0。是否隨上級窗口變化大小-fill
 style爲x,y或both。是否充滿某個方向-in other放在其他窗口內-ipadx
 amount-ipady amount-padx amount和周圍的間隔,可以是象素如5,
或者屏幕距離1.3c,20m(c,m分別代表釐米,毫米)
-pady amount-side side值爲left, right, top, or bottom.缺省爲top.
 pack的安排很靈活,當toplevel或者上級窗口變化時能夠隨之變化,
但是和人類的直覺有點不一致。
需要安排複雜位置時可以使用frame窗口分層次安放。這是最基本的
安放方法。
frmae .f -expand 1 -fill bothbutton .f.bentry .f.epack .f .f.e
 .f.b如果pack錯誤可以重新用新的參數pack一次,只改變放置方式

如果想銷燬窗口destroy .f查看所有子窗口winfo children .winfo
 children .fwinfo還可以查看窗口的很多其他信息。
其他的安放方式有:
place window option value ?option value ...? place configure
 window option value ?option value ...? place forget window
 place info window place slaves window  可選屬性爲-in master-x
 location -relx location -y location-rely location-anchor where-width
 size象素點-relwidth size和主窗口比例-relwidth 1.0-width 5 makes
 the slave 5 pixels wider than the master. -height size-relheight
 size-bordermode mode其中x,y,width,height都是用象素(和屏幕
寬度)作單位,rel前綴的用主窗口比例作單位,變化範圍0.0到1.0,
二者可以並用。
第三種gridgrid .base.button -row 1 -column 0 -columespan 3行
和列都從0開始算起。上面的命令將.base.button放在.base窗口裏面,
排在第2行第1列,寬3列。
列寬由本列最寬的窗口決定。rowspan同上,可選。
該命令同樣有-padx,-pady,-sticky(類似pack的anchor)-in otherwindow
屬性grid rowconfigure $master $index ?-option?定義$master窗
口內第index個row的排法。屬性-minsize, -weight and -pad.
radiobutton有-value,-variable屬性,一組radiobutton公用一個variable,
它的值就是選定的那個按鈕的value屬性。
checkbutton只有-variable屬性,反映它按下與否。
label標籤,用來指示旁邊的窗口的用途,無交互作用。

scrollbar滾動條scrollbar .sc -after .t -fill y -side right -command
 ".t yview"-orient      指示是橫是豎,值爲horizontal或vertical -command
滑動時執行的命令。基本都是和它聯繫的窗口的xview或者yview命令

上面命令建立一個豎的滾動條貼在.t窗口右邊,並帶動它滾動常用的
可滾動窗口有entry,listbox,text和canvas窗口。
窗口建立後想再更改其屬性使用configurepathname configure ?-option?
 value例.t conf -bg red獲得其屬性pathname cget -option取得option
的值
4。3bind命令使某個窗口發生指定事件時執行一系列命令bind pathname
 ?sequence? {script}例bind .e <Return> {open $as r}任何時候
在.e裏面按下回車鍵時打開輸入文件名代表的文件。
事件sequence爲Control   Mod2, M2Shift   Mod3, M3        Lock    Mod4, M4Button1,
 B1     Mod5, M5        Button2, B2     Meta, MButton3, B3      AltButton4, B4  DoubleButton5,
 B5     TripleMod1, M1和按鍵或者Activate        Enter   MapButtonPress, Button  Expose  MotionButtonRelease     FocusIn MouseWheel      Circulate       FocusOut        PropertyColormap        Gravity ReparentConfigure       KeyPress,
 Key    UnmapDeactivate KeyRelease      VisibilityDestroy       Leave窗口
事件的組合,Any表示任意一種修飾(如Ctrl,Alt)。
<1>鼠標左鍵單擊a (注意不含<>)a被按下,相當於<key-a>的簡寫<Double-Button-1>
鼠標左鍵雙擊<Control-Key-F1>ctrl-F1被按下<Control-Key-c> Ctrl-c<Enter>
鼠標進入窗口在script裏面可以用%f,%K等參數獲得進一步信息。
常用的有%b被按下的按鈕。注意3鍵鼠標左中右分別爲123%k被按下的
鍵盤鍵,數字%t事件發生的時間,單位爲毫秒%x%y鼠標指針位置,從
當前窗口算起%A被按下的鍵盤鍵,單個字母%D滾輪鼠標的滾動值%K以"F1","Alt_L","a"
表示的系統鍵表示%N以數字表示的系統鍵表示%T時間類型%W當前窗口%X%Y
鼠標指針位置,從根窗口算起(大多數情況,即屏幕左上角)
用event add <<event_virtual>> <event_simple>可以定義虛擬事件,
從而把多個不同的事件用同一方法處理,比如把ctrl-V和Shift-Ins
都定義爲<<paste>>event delete刪除虛擬事件
4。4 listbox pathname ?option?列表框pathName curselection返
回當前選擇的項目列表pathName insert index ?element element ...?
加入條目,index可以是數字或者end,從0開始計數pathName delete
 first ?last?pathName get first ?last?如名稱pathName see index
將第index條移動到當前可見範圍(因爲它是可滾動的,see和xview,yview
一樣是text,canvas等可滾動窗口共有的屬性)
屬性-wrap(一行長度超過右邊界是否折行顯示)-width,-height
text pathname ?option?多行文本窗口很多命令使用如下位置參數》
絕對字符位置index1.0第一行第1個字符2.3第2行第4列end尾部@30,45
在象素點30,45處的字符》相對字符座標modifier+/-count lines/chars
例+3 chars從指定位置再向後3個字符linestartlineendwordstartwordend
移動到行/字的首/尾
常用命令pathname get index1 ?index2?取得index1和index2之間的
文字(包含tag屬性)
pathname dump -text index1 ?index2?(僅輸出文字)比如set a [.t
 get 1.0 end]就將.t的全部內容賦值給$apathName insert index chars
 ?tagList chars tagList ...?插入一段文字,可以帶顏色,大小等tag
指定的屬性tagList是用pathName tag configure tagName ?option?
 ?value? ?option value ...?定義的一個屬性標籤比如.t tag configure
 fly -bg red -fg blue.t insert end "I like this" fly就在最後
插入紅色背景藍色文字的I like this..t tag add fly 1.0 1.5 2.5
 2.7這將1.0到1.4和2.5-2.6這幾個字符變成紅底藍字類似有tag delete
操作有一個缺省的tag名爲sel對當前選擇文字起作用。
pathName tag bind tagName ?sequence? ?script?將有tagname屬性
的字符發生的事件聯繫到處理程序pathname window create newpathname
 ?option?在窗口內建立別的子窗口。
pathName search ?switches? pattern index ?stopIndex?尋找指定
字符串,返回第一個發現的位置switch爲-forwards-backwards-exact-regexp-nocase-count
 varName-elidepathName mark option ?arg arg ...?設置mark位置,
該mark名稱可以作爲位置參數使用
4。5 Canvascanvas是用來畫圖的。
canvas pathname ?option?pathname create type arg arg ?option?
注意如果要對該對象進一步操作,一定要指定tag,這裏的tag意義和text
裏面不一樣,是對象的代號。
canvas .c pack .c.c create oval 1 1 300 300 -fill red -tags
 o1在.c畫了一個紅色的園,標籤爲o1..c move o1 20 30將o1向右下
移動20,30象素scale是放大,delete是刪除,bind聯繫命令,raise/lower
提高降低上下順序(因爲會互相遮蔽)
.c postscript -file a.ps將.c的內容存到a.ps文件裏面.c itemconfigure
 o1 -fill blue將o1的填充換爲藍色all是一個包含所有對象的tag-dash
 pattern線條類型-outline color線條顏色對象類型弦,餅:pathName
 create arc x1 y1 x2 y2?option value option value ...?-extent
 degrees-start degrees-style type可選爲pieslice  chord arc位
圖pathName create bitmap x y?option value option value ...?-bitmap
 bitmap-foreground color-background color圖片pathName create
 image x y?option value option value ...?-image nameimage是
用image create bitmap|photo -file filename定義的圖片bitmap與
之類似屬性有-gamma -height -width除了用-file也可以用-data {
字符串}來定義,字符串是對應文件的uuencode結果
線pathName create line x1 y1... xn yn?option value option value
 ...?-arrow where可選first,last,both,none-smooth-splinesteps
 number-fill -width橢圓pathName create oval x1 y1 x2 y2?option
 value option value ...?多邊形pathName create polygon x1 y1
 ... xn yn?option value option value ...?矩形pathName create
 rectangle x1 y1 x2 y2?option value option value ...?文字pathName
 create text x y?option value option value ...?-font fontName-text
 string-width lineLength子窗口pathName create windowx y?option
 value option value ...?
注意帶有scrollbar的時候請設置-scrollregion {x1 y1 x2 y2}屬性
和-xscrollcommand {$hscroll set}和/或對應的y方向屬性同時帶有x,y
方向的scrollbar時一般用如下安放法frame .fcanvas .f.cs -scrollregion
 {x1 y1 x2 y2} -xscrollcommand {.f.hscroll set} -yscrollcommand
 {.f.vscroll set}scrollbar .f.hscroll -orient h -command {.f.cs
 xview}scrollbar .f.vscroll -command {.f.cs yview}grid .f.cs
 -row 0 -column 0 -sticky newsgrid .f.hscroll -row 1 -column
 0 -sticky newsgrid .f.vscroll -row 0 -column 1 -sticky newspack
 .f -expand 1 -fill both
4。5系統對話框tk_getOpenFile ?-filetypes filePatternList?返
迴文件名tk_getSaveFile ?-filetypes filePatternList?同上set types
 {
{{Text Files}       {.txt}        }
{{TCL Scripts}      {.tcl}        }
{{C Source Files}   {.c}      TEXT}
{{GIF Files}        {.gif}        }
{{GIF Files}        {}        GIFF}
{{All Files}        *             }}set filename [tk_getOpenFile
 -filetypes $types]
if {$filename != ""} {
# Open the file ...}因爲tk沒有好的文件選擇組件(在擴展的Tix
和itk裏面有),這兩個很好用。
部分tk還有tk_getColor等對話框
4。6菜單menu pathName ?options?-type  menubar, tearoff, or normal
當爲tearoff時可以移動位置,menubar橫向menu窗口可以也必須被nemubar
和toplevel調用,是菜單的主體,因爲它本身是無法被pack到窗口上
的。
pathName activate index添加條目pathName add type ?option value
 option value ...?type爲cascade, checkbutton, command, radiobutton,
 or separator,-tearoff是否可以被撕下(與一般情況兼容的話最好
設爲0)
-label text-accelerator value快捷鍵-command value指定選擇時
使用的命令-menu value當類型爲cascade時指定下級菜單-underline
 value第value個字符有下劃線pathname insert index type option...pathName
 delete index1 ?index2?菜單條可以有bitmap,顏色等屬性
menubutton pathName ?options? -menu指定下拉菜單,由menu定義
這個一般作窗口菜單,因爲可以自由安放位置(比如把help菜單安放
在最右)
toplevel pathname ?option?在當前總窗口外創一個新的最上層窗口,
比如運行對話框時。
-menu指定一個menu爲窗口菜單toplevel窗口可以用wm命令進行隱藏,
顯示,最小化等操作。
wm command pathname可選命令aspect, client, command, deiconify,
 focusmodel, frame, geometry, grid, group, iconbitmap, iconify,
 iconmask, iconname, iconposition, iconwindow, maxsize(最大
化), minsize, overrideredirect, positionfrom, protocol, resizable
(是否固定大小), sizefrom(改變大小), state, title(標題),
 transient, or withdraw(隱藏)
tk_popup menu x y彈出一個pop菜單,注意x y是相對於屏幕而非窗
口bind .t <2> {tk_popup .rightbuttonmenu %X %Y}
4。7消息提示和對話框dialogvwaitafter 100after控制檯console hide/show/title
另開一個新Tcl進程
5。大型程序在tcl內執行某個.tcl腳本文件的方法source filename
隔離名字空間namespace命令,定義後使用aa::get形式的變量和函數
使用Http package可以讀取WWW網頁,itk,Tix擴展package可以增加
複雜的窗體類型
tcl的命令的有限的,也不能指望用內置語句編出什麼複雜的底層功
能如多媒體、複雜計算來,tcl/tk主要也不是用來作這個。
一般的擴展其功能的方法爲:
用exec執行外部命令。比如用來作rc文件配置的前端,或者傳輸複雜
參數給命令行。
使用package。用swig協助編寫C語言動態連接庫,用load命令裝載後
可以增加新的變量和函數使用C語言內嵌tcl/tk。這個可以很精細的
控制其運行,增加新命令,tcl/tk只作界面。這個通常都比直接用C+Tk
編程快而且易於調試。

應用舉例1.比如想用wget或者curl批量下載,配置其參數。給新手配
置程序的簡單界面。在Palm等掌上電腦鍵盤輸入不方便的情況。
2.或者在圖形界面時要用帶輸入參數的腳本,比如命令行的電子字典,
你又懶得新開一個xterm,情願鼠標點+copy/paste完成工作。
3.用canvas作圖。當你有很多類似的圖形要畫,特別是那些用gnuplot
不方便作的圖,難道你會因此去啃整套windows/X編程嗎?
或者即使你願意,你能保證你的程序不會太大、可移植嗎?你的系統
上有X的開發工具嗎?
當然基於文本的替代方案是你可以用latex的作圖工具或者直接寫Postscript,
真的如此我覺得你太強了。
另外一個是替代是java,Perl,Python等其他語言,但是系統都偏大
。而且不一定裝了Tk支持。
實際上作圖正是我開始研究、熟悉tcl/Tk的主因

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章