Tcl/Tk學習筆記
整理者:海洋大學 楊善文
文件授權:自由授權(允許自由散佈、修改、重製、使用無任何限制)
文件版本:2009.09.30
Tcl/Tk官方網站:http://www.tcl.tk/
這是從這兩份文件資源學習而來的筆記,部份功能筆者還未成功試出來,所以原作部份內容筆者無法做紀錄,直到摸索成功後才有辦法加進此筆記內,書本的章節後半段也還沒看完,目前中文筆記份量只有這些。
閱讀原作:
1.http://www.linbox.com/ucome.rvt/any/fr/Ressources/Cours/tcl/cour1_tcl.pdf
2.Tcl and the Tk Toolkit, John K. Ousterhout著, ISBN:3893197931 (1994)
第一份文件資料是非常精簡易懂的,也是筆者推薦的入門教材,第二份文件是一本書,裡面的內容非常詳盡,涵蓋了幾乎所有Tcl/Tk的功能介紹,缺點是這本書已經很老了,不過可以從第一份文件(2005年釋出)來彌補更新功能的介紹。因此這份學習筆記即是這兩份文件的中文統整(算是重點整理)。
Tcl部份:
Tcl語言語法:
*每條命令句以「換行」或是分號「;」分隔,每行如果長度過長可用反斜線「\」斷成兩行書寫,註解號是「#」,註解號後的語句程式不會讀取。空格區隔兩個敘述單詞。方括號 [ ] 用於母命令句內的子命令句先執行出結果,再傳至母命令句做處理。「$」代表變數表示(一個已宣告的)。反斜線另一功能是「置入特殊字元」或「將TCL認定的語句變成普通字元」,大括號 { } 用於部份函式和陣列。
*命令句語法:指令 變數 參數 …
Par exemple:
set a 24 #將24存入a變數,宣告變數指令:set
set a 24; set b 25 #同一行有兩個命令句,用「;」隔開
expr 24/3.2 #計算24除3.2的結果,求值指令:expr
set a ''這是什麼'' #將'' ''內的值都存入a
set a [ set b ''zzz'' ] #先執行完 [ ] 內的,再將結果存入a
puts $a #在螢幕上印出之前宣告的a內含值,輸出指令:puts
例2: set x 4
set y x+10 #這樣「x+10」會被當成字串看待
set y [ expr $x+10 ] #這樣才能真正能計算出結果「14」,存入y
*變數取代:
Par exemple:
foreach num { 1 2 3 4 5 } {
button .b$num # button是Tk的按鈕宣告
} #此結果是num從1到5,而產生b1,b2...,b5的變數
*特殊字元:1.''\a'':聲音警告 2.''\b'':回去一格(0x8) 3.''\n'':換行(0xa)
4.''\t'':Tab鍵(0x9)
*Tcl支援兩種變數形式,「單一變數」和「陣列」。
變數處理指令:
append:
添加一個新變量(字串或數字等)到一個變數中,接在原來內含值之後而不覆寫原內含值。用法:append 變數名 ''待加入的變量'' …
incr:
對一個變數內含值加一(預設)或是加某數。用法:
- 1. incr a # 對a 變數內含值加一
- 2. incr a 16 #內含加16
set:
宣告、覆寫一個變數。用法: set a 16 #將16存進a變數
unset:
清除變數(已宣告的)。用法: unset a #清除a
*Tcl的變數一定是字串,不需要宣告變數類型,由符號自動判斷。
*Tcl的陣列與矩陣:可直接宣告矩陣來存值,不用預先定義矩陣大小。
用法: set martix(1,1) 140 # 將140存入(1,1)區域
*Tcl內定變數:
argv0:執行一個Tcl/Tk的腳本檔案時,此變數argv0即是該檔案的「檔名」
argv:執行Tcl/Tk腳本,後接的參數或變數,即存入此變數
argc:同上之後接參數的數量
env:系統環境變數,可從此變數調用。例:$env(PATH)
*整數表示式:
十進位:不需加任何在數字之前。例:376
八進位:數字前加「0」。例:0517
十六進位:數字前加「0x」。例:0x14f
*條件判斷:正確則輸出「1」值,否則是「0」。
*算符:1.加減乘除:+,-,*,/ 2.餘數:% (只能算整數)
3.移位:a<<b (a向左移b個bit), a>>b (a右移b個bit)
4.大小判斷:< , > , <= , >= 5.是否等於:== 、 是否不等於:!=
6.AND:&& OR:|| NOT:!
7.a?b:c :如果a條件不是0,則進行b,否則執行c。
TCL內建數學函式:
abs(x) |
x的絕對值 |
hypot(x,y) |
(x2 + y2)1/2 |
acos(x) |
cos-1(x),範圍:0 ~ π |
int(x) |
|
asin(x) |
sin-1(x),範圍:-π/2 ~ π/2 |
log(x) |
x的自然對數(e為底) |
atan(x) |
tan-1(x),範圍:-π/2 ~ π/2 |
log10(x) |
x的自然對數(10為底) |
atan2(x,y) |
tan-1(x/y),範圍:-π/2 ~ π/2 |
pow(x,y) |
x的y次方:xy |
ceil(x) |
x值無條件進入至整數 |
round(x) |
|
cos(x) |
餘弦函數cos(x) |
sin(x) |
正弦函數sin(x) |
cosh(x) |
雙曲線函數cosh(x) |
sinh(x) |
雙曲線函數sinh(x) |
double(x) |
|
sqrt(x) |
√x |
exp(x) |
指數:ex |
tan(x) |
正切函數tan(x) |
floor(x) |
x值無條件捨去至整數 |
tanh(x) |
雙曲線函數tanh(x) |
fmod(x,y) |
x除以y的餘數 |
|
|
*設定Tcl數值精度:使用變數「tcl_precision」。
Par exemple: set tcl_precision 12
expr 1.11111111 + 1.11111111 => 2.22222222
*Lists:字串或數字的集合陣列之使用:
當一些字串以空格分開時,每個字串即是一個個別單元(元素)。
list:宣告一個列告,每個以空格間隔的都是一個個別單元。用法:(下標線辨別數目)
list {a b c} {d e} f {g h i} => {a b c} {d e} f {g h i} :共四個元素
concat:宣告一個列表,將每個子集合內的元素,都統整進一個大列表集合中。用法:
concat {a b c} {d e} f {g h i} => a b c d e f g h i:共九個
lindex:從列表中取出一個元素。用法:
lindex 列表 index (index代表要從列表中取出第幾個數)
例: lindex {John0 Anne1 Many2 Jim3} 1 => Anne (上標代表引數)
lindex { a0 b1 {c d e}2 f3} 2 => c d e
llength:查看列表中有多少元素。用法:llength {{a b c} {d e} f {g h i}} => 4
linsert:插入一個新元素到列表。例: set x {a b {c d} e} => a0 b1 {c d}2 e3
linsert $x 2 X Y Z => a0 b1 X Y Z2 {c d}3 e4 # 插入到第三個
lreplace:置換列表中的一個元素,用法:lreplace 列表 index1 index2 置換的元素
(index1和index2控制要被置換的元素範圍,從index1到index2)
例: 1. lreplace {a0 b1 {c d}2 e3} 3 3 => a b {c d}
(從3到3,即只有第4個要被置換,後不接置換的元素即該項被刪除)
2. lreplace {a0 b1 {c d}2 e3} 1 2 {W X} Y Z => a {W X} Y Z e
lrange:從列表取出某特定區域範圍的元素。用法:lrange 列表 index1 index2
例: lrange {a0 b1 {c d}2 e3} 1 3 => b {c d} e # 取出1~3的範圍
lappend:添加元素進列表尾端。例:set x {a b}; lappend x 3 => a b 3
lsearch:尋找指定字串在列表中是否存在,並顯示在第幾個。(從0開始,找不到顯示''-1'')
例: set x {John0 Anne1 Mary2 Jim3}
lsearch $x Mary => 2
lsearch $x Phil => -1 # 沒找到,傳回「-1」值
lsearch -glob $x A* => 1 # 加「-glob」參數可用萬用字元收尋
lsort:將一個列表內的元素做重新排序。(預設字母順序由小到大)
例: lsort {John Anne Mary Jim} => Anne1 Jim2-1 John2-2 Mary3
(第一個字母相同再檢查第二個,加「-decreasing」參數為反向(由大到小)排序,加
「-integer」參數把元素當數值來比較)
split:將一串字串切開,從指定的字元來區分。用法:split 字串 指定區分字元
例: set x a/b/c; set y /usr/include/sys/type.h
split $x / => a b c
split $y / => {} usr include sys type.h
join:將許多分離的字串接合,用指定的字元接合。用法:join {字串1 字串2 ... } 指定字元
例: join {{} usr include sys types.h} / => /usr/include/sys/types.h
*程式流程控制:
if:如果某指定條件成立,即執行,否則略過。語法:if {判斷句} {執行句}
Par exemple :if { $x < 0} {
set x 0 # 若$x的值小於0,就定x=0
}
if-else迴圈:多條件判斷用「elseif」相接,最後都不符合時,跳到「else」區。
If { 判斷句1 } {
執行句1
} elseif { 判斷句2 } {
執行句2
} elseif { 判斷句3 } {
……
} else {
……
}
for迴圈:變數從某區到某區時,連續執行迴圈內語句。
用法:for { 變數起始值 } {判斷變數是否到達終值 } { 變數增加量 } {
執行句(迴圈區域)
}
例: for { set i 0 } { $i <= 10 } { incr i 1} {
puts $i
}
while迴圈:判斷變數是否符合條件,不符合即跳出。用法:while { 條件句 } { 執行句 }
例: while { $i >= 0 } { puts $i }
foreach:將列表值依序置入變數中條件判斷式
用法:foreach 變數 列表 { 執行句 }
例: foreach a $b {
puts $a # 把b列表的內含值陸續置入變數a中,然後印出a值
}
*迴圈內的條件控制:break(跳出)、continue(繼續:用於迴圈終點)
switch形式條件判斷:
switch $x {
a { 執行句1 } # 若$x值為a,執行「句1」指令,以此類推。
b { 執行句2 }
c { 執行句3 }
…
}
eval用途:一次對整個變數內含做全部處理
例:清空列表所有元素: set zzz { a b c d }
eval unset $var
宣告新函式並使用:
proc 新函數名 { 外部引入變數(1個或多個) } { 執行句 }
例1: proc sum {a b} {expr $a + $b } # 設定兩個變數a,b的函式sum
sum 3 4 => 7 # 3、4對應入a、b進函式內做運算
例2: proc fac x { # 定義階乘函式
if { $x <= 1 } {
return 1
}
expr $x * [ fac [expr $x -1 ] #遞迴計算$x
}
fac 4 => 24 (expr 4* [fac 3] = expr 4*3*[fac 2] = expr 4*3*2*[fac 1] = 24)
*區域變數與全域變數:一般宣告的變數在函式執行結果即消失,稱為區域變數。若宣告「global 變數名」即可應用在整個程式中。但Tcl不提供靜態變數。
*字串處理:
利用string指令後接參數來控制字串;format指令定義輸入輸出變數的精度與類型。
找出字串中第幾個字元: string index ''字串'' 引數(第幾個字元)
取出字串某區域內的字元:string range ''字串'' 開始數 結束數(數字或''end'')
尋找最左邊的符合字串: string first ''欲比對字串'' ''字串''
尋找最右邊的符合字串: string last ''欲比對字串'' ''字串''
將兩字串做比對: string compare 字串1 字串2 , string match 字串1 字串2
計算字串長度: string length ''字串''
字母大小寫轉換:全變大寫 string toupper ''字串''
全變小寫 string tolower ''字串''
例: string index ''Sample string'' 3 => p # 從零算起
string range ''Sample string'' 3 7 => ple s
string compare A字串 A字串 => 0 # 兩字串吻合,傳回值「0」
string compare A字串 B字串 => 1或-1 # 兩字串不合,傳回值「1」或「-1」
string length ''sample string'' => 13 # 長度從1算起
string match A字串 A字串 => 1 # 符合傳回「1」,不合為「0」
string match A字串 B字串 => 0
*常用萬用字元與正規表示法:
從零到多個任意字元:* 正規表示:[ 從多少到多少 ]
單個任意字元:. 例如: [ 0-9A-Z]
開始處任意字元:^ 結束處任意字元:$
判斷字串是否符合指定區域內的元素:regexp { 正規表示式 } 字串
符合傳回「1」,不合傳回「0」
格式化輸出字串: format ''字串'' [輸入變數] # 類似C語言的printf()
例: format ''10的平方根是 %3f'' [expr sqrt(10)] => 10的平方根是3.162
浮點數:%f,%X.Yf (小數點後有Y位,總長X位)
整數:%d,%Xd (整數寬度X位)
字串:%s 字元:%c
類似printf()的輸出方式:puts [ format ''字串區'' 變數… ]
*檔案存取:
開啟檔案:open 檔案名 參數(r,w,a,+)
關閉檔案:close 檔案變數
例: set f [ open 新檔案 w+ ] # r,w,a後面的「+」讓檔案可讀寫
close $f # 第一行宣告的f是檔案變數
開檔讀出字串: sets 檔案變數 傳入變數 (每次一行的方式傳入數值)
read 檔案變數 (一次讀出全部內容)
例: set f [ open 新檔案 r+] # Tcl沒有「rw」選項,與C不同
while { [ gets $f a ] >= 0 } {
puts $a # 從$f得到字串後輸入至a中,一次讀一行
}
close $f
set f [ open 新檔案 r+]
set b [ read $f] # 檔案內容全部輸入至b中
puts $b # 會印出跟之前一樣的內容
*檔案訊息: file 選單 檔案名稱
file用法與選單關係:
指令 |
選單 |
說明 |
傳回值 |
file |
exists |
檔案是否存在 |
是=1/否=0 |
|
executable |
檔案是否可執行 |
是=1/否=0 |
|
readable |
檔案是否可讀取 |
是=1/否=0 |
|
writable |
檔案是否可寫入 |
是=1/否=0 |
|
isfile |
該名稱是否是檔案 |
是=1/否=0 |
|
isdirectory |
該名稱是否是目錄 |
是=1/否=0 |
|
owned |
目前使用者是否有擁有權 |
是=1/否=0 |
|
size |
檔案大小(bytes) |
大小數值 |
|
stat |
檔案訊息 |
訊息陣列 |
例:file stat 某檔案 info # 將某檔案的訊息傳入變數info中
執行外部指令或檔案:exec 外部指令 延伸變數
例: exec cat << ''test donne'' > foo
exec不能處理萬用字元,但可以用eval處理:
例:exec rm *.o不能用。eval exec rm [ glob *o ] 可以。
*離開Tcl Shell:exit指令,無傳回值。
*查看之前輸入的Tcl指令:history
Tk部份:
Tk視窗程式語法:
物件主從關係:.a.b.c… ,「.c」從於「.b」、「.b」從於「.a」。子物件會在主物件下產生。物件名稱宣告: .物件名。
宣告以Tk作腳本語言: #!/usr/bin/wish (大部分平台預設位置)
wish8.5的預設中文字型優於8.4版,8.5版的Tcl/Tk速度比8.4快很多。但大部分Linux與[Open]Solaris等平台預設都是安裝8.4。兩大版本共存時宣告用8.5: #!/usr/bin/wish8.5
新增一個物件視窗:toplevel .物件名
這將會產生兩個視窗:原本Tk腳本預設產生一個,toplevel額外再產生一個。
摧毀一個物件:destroy .物件名
按鈕指令:button .物件名 -text ''按鈕上的文字'' -command { 指令 }
視窗內文字:label .物件名 -text ''文字內容'' -textvariable ''變動文字變數''
用相對位置放置物件:pack .物件1 .物件2 … -side 方向 -fill [x/y/both]
*當物件(按鈕、文字、選單)宣告後,一定要用pack等置放物件指令在視窗中初始化,排列方式(-side)的方向有(top,bottom,left,right):上、下、左、右。代表由此宣告方向往另一方向排列。例:''-side left''代表由左往右排列。
而''-fill''選項是物件朝X或Y方向填滿視窗,當按鈕或其他物件內文字數量不同時,會造成物件大小不一致,利用''-fill''填滿可美化視窗的用途。
例: button .a -text ''abc''
button .b -text ''abcdefg'' # 宣告三個不同長度的按鈕
button .c -text ''a''
- 1. pack .a .b .c -side top # 左圖,產生三個長度不一的按鈕
- 2. pack .a .b .c -side top -fill x # 是否加''-fill''參數所造成的差異(右圖),平舖並排
pack的物件間距選單''-padx''與''-pady'':後接數值。該物件與週邊物件或視窗邊緣的距離多少。Tk的距離數值表示法:[數值][單位]
*單位:c(公分)、m(公釐mm)、p(像素)。例:''72m''代表72mm、''3c''代表3公分
3D樣式邊框物件:frame .物件名 -relief 邊框樣式 -borderwidth 邊框寬度
''-relief''選單有:raised(凸出)、sunken(下凹)、flat(平板)、groove(凹邊框)、 ridge(凸邊框)
''-borderwidth''與''-bd''(縮寫選項):後接[數值][單位],控制邊框框線寬度
在物件產生、初始化後改變物件屬性: .物件名 configure 選項參數 …
物件的大小選單:''-height'' 高度數值、 '' -width '' 寬度數值
物件的顏色選單:''-background'' 背景色、 ''-foreground'' 前景色
顏色表示法: #f00:紅色、#ff0:黃色、#fff:白色 … (#RGB 十六位值)
用網格座標放置物件:grid .物件名 -column [數值] -row [數值]
=> 將物件放在第幾行第幾列的區塊中
輸入文字方塊:entry .物件名 -textvariable 變數名
=> 宣告一個可輸入文字的方塊物件,輸入的文字存入「變數名」中
可多選方塊物件:checkbutton .物件名 -text 選項文字 -variable 變數 -command { 指令 }
測試例: checkbutton .a -text ''選項文字'' -variable var1 -command { puts $var1 }
pack .a
=> 第一行用途是測試當視窗產生後,點選選擇框後,變數會有什麼改變。
當選取時,終端機會印出1。取消選取則會印出0
單選擇方塊物件:radiobutton .物件名 -text 選項文字 -variable 變數 -value 變數
測試例: radiobutton .a -text "Mig-1.44" -variable var1 -value 3 \
-command { puts $var1 }
radiobutton .b -text "Tu-160" -variable var1 -value 5 \
-command { puts $var1 }
pack .a .b -side top -fill x
radiobutton的''-value''選項是當點選了這個物件,會將怎樣的數值存入''-variable''後宣告的變數中,如範例所顯示,點到Mig-1.44就會印出3,點到Tu-160就會印出5。一個視窗中能夠多少選多少的數目取決於''-variable''宣告的變數有幾種,若多個radiobutton物件都宣告用相同變數,則整個視窗內就只能多選一。但是若每個物件都宣告用不同變數時(例如第一行是var1,而第二行是var2),則成為多選狀態,勾選完就不能取消勾選了。
訊息視窗指令:message .物件名 -aspect 自動計算行寬 -justify [left/center/right] \
-text ''訊息文字''
*物件的外在事件觸發機制:bind .物件名 <觸發方式> { 動作 }
用bind宣告觸發事件,並用pack或grid初始化進視窗後,利用滑鼠或鍵盤的鍵(觸發方式)對著此物件,即會產生動作。
Bind的使用例:set var 0
label .lab -textvariable var # 視窗中顯示可變動文字
bind .lab <Enter> { incr var } # 滑鼠一指到物件即加1
pack .lab
=> 以上程式只要滑鼠指標一移到物件.lab的區域內,即會讓顯示的數值加1。
觸發方式列表:
滑鼠:<Enter>:滑鼠一指到物件即觸發(移進物件區)
<1>:滑鼠左鍵觸發 <2>:滑鼠中鍵觸發
<3>:滑鼠右鍵觸發 <motion>:滑鼠在物件上一移動即觸發
<ButtonRelease>:滑鼠三鍵皆觸發 <Leave>:移出物件觸發
鍵盤:all <Key>:常用方式,讀出所有鍵盤數值至變數''%K''中。
將鍵盤讀入字元呈現在物件中範例:
label .lab -textvariable var
bind all <Key> {set var ''%K'' }
bind .lab <Motion> { set var ''%x %y'' }
pack .lab # 第二行的%K可顯示讀入字元,第三行讀滑鼠座標
常用bind內定變數:
1.「%x」與「%y」:滑鼠在「物件內」的座標
2.「%K」:鍵盤讀入字元
3.「%W」:由滑鼠觸發物件,此變數會讀出此物件的名稱:''.物件名''
視窗加入圖片:image create [photo/bitmap] 圖片代名 -file 圖檔名稱或路徑
圖片產生可跟label結合宣告,再用pack跟其他物件作排列,photo是彩色影像模式,bitmap是黑白,圖檔通常要用GIF類檔案。
使用例:image create photo test -file /usr/share/pixmaps/xxx.gif
label .testp -image test
pack .testp # 將圖以label物件呈現在視窗中
選項列視窗:listbox .物件名 -yscrollcommand ''捲動軸物件設定''
使用方式例:listbox .a -yscrollcommand ''.捲動軸物件 set''
pack .a
.a insert 字串 …
捲動軸:scrollbar .物件名 -command ''選單物件設定''
捲動軸scrollbar必須與旁邊文字或選項列物件結合宣告,才能拉動對方。
使用例1:text .text -yscrollcommand ''.a set''
scrollbar .a -command ''.text yview''
pack .a -side right -fill y
pack .text -expand yes -fill both
.text insert ''字串…''
使用例2:listbox .a -yscrollcommand ''.b set''
scrollbar .b -command ''.a yview''
pack .a .b -side right -fill y
數值拉動軸:scale .物件名 -label ''說明文字'' -from 初值 -to 末值 \
-orient [ horizontal/vertical] -length 軸長
「-orient」參數是拉動軸的方向(平行/垂直)
使用例:scale .a -label "時間調整器" -from 0 -to 200 -orient horizontal \
-length 10c -variable zz
button .b -text "確定" -command { puts $zz } # 每按一次確定鈕就會印出之前調的數值
pack .a .b -side top -fill x
選單物件:menu .物件名 #先宣告選單物件,再將東西添加進去
.物件名 add [command/separator/radiobutton/checkbutton/cascade/…] \
-label 選單文字 -command { 指令 }
選單標題按鈕:menubutton .物件名 -text ''標題文字''
使用方式例:
menubutton .a -text "標題文字" -menu .a.menu1
pack .a # 先初始化物件再加選單進去
menu .a.menu1 # 加入選單
.a.menu1 add command -label "離開" -command { exit }
.a.menu1 add separator # 純產生分隔線
.a.menu1 add cascade -label "子選單" -menu .a.menu1.menu2 # 產生子選單圖樣
.a.menu1 add checkbutton -label "選項框" -variable zz -onvalue S300 \
-offvalue SS-N-22 -command { puts $zz} # 勾選與不勾選會傳不同值進zz
menu .a.menu1.menu2
.a.menu1.menu2 add radiobutton -label "子單選區" … # 加入子選單
利用meu指令給某個物件加上選單功能,通常加在用menubutton宣告的按鈕下,cascade選項可在選單中產生一個三角標示,可在此加入子選單(仍然用menu宣告)。checkbutton利用「-onvalue」和「-offvalue」設定輸入至「-variable」的變數數值。
文字視窗物件:text .物件名 ''宣告整個視窗的大小樣式…''
.物件名 |
insert |
物件內插入文字 |
|
tag |
將宣告的標籤作處理 |
|
mark |
文字的位置標示 |
|
image |
|
|
window |
|
|
search |
|
|
cget |
允許查詢物件的選單值 |
|
configure |
調整物件的選項 |
|
delete |
刪除部份物件內容 |
|
dump |
|
|
get |
|
|
see |
|
|
xview |
|
|
yview |
|
文字字串指位器:寫法「X.Y」與「@x,y」、「end」、marque名、tag名.[first/last]
X.Y:第「X」行第「Y+1」個字元,例:「1.10」是第1行第11個字元
@x,y:第x長與y寬度「單位pixel」中的字元
@0,0:螢幕左上角的字元
end:行尾字元
將一個帶有標籤的文字插入:.物件名 insert 位置 ''文字字串'' 標簽名
改變某標籤的那段文字屬性:.物件名 tag configure ''標籤名'' 選項 …
使用例:.a tag configure zz -justify center # 將zz代表的那段文字置中
*用tag delete只能刪除目前標籤宣告的屬性,而不是標籤代表的那段文字
例:.a tag delete zz # 文字還在,置中被解除
*通常在文字或繪圖物件視窗中,增加文字或圖形時後加tag(標籤),主要用途是對他們作後續操作(移動、改變大小等)。
使用例: text .a -height 30 -width 80 -yscrollcommand ''.b set''
scrollbar .b -command ''.a yview'' # 第一二行文字與捲動軸做好連結
pack .a .b -side left -fill y # 兩物件填滿視窗垂直向
.a insert 1.0 "這是什麼?\n" Mig35 # 字串用「\n」換行,跟C一樣
.a insert 2.end "Was ist das?\n" Su35
.a tag configure Su35 -justify center # 標示為Su35的那段文字置中
*若字句尾端沒有加「\n」,則前面的insert指定位置是無法自動換行的。若前一行的文字字尾沒有「\n」,字串「Was ist das?」會直接接在「這是什麼?」之後,縱使宣告「2.end」放在下一行都沒有效。
*繪圖物件指令: canvas .物件名 -width 長度值 -height 高度值
pack .物件名 # 初始化完的繪圖視窗,即可加入圖形
產生圖形: .物件名 create 圖形選項 座標群 -tag 標簽名
移動圖形: .物件名 move 標簽名 新座標值
改變圖形屬性: .物件名 itemconfigure 標簽名 選項 …
create的圖形選項:line(直線)、oval(橢圓形)、arc(扇形)、polygon(多邊形)、 rectangle(長方形)、text(文字)、image(GIF圖檔)
create的座標群表示法:x1 y1 x2 y2 x3 y3 … (兩個一組橫向依序排列)
產生直線:.物件名 create line [座標群:起點 終點… (兩點才能畫一直線) ]
產生圓形:.物件名 create oval [端點1 端點2]
*在tk的圓形是由兩個端點構成的長方形的內接圓,而非用圓心定義。
產生扇形:.物件名 create arc [端點1 端點2] -start 起始角度 -extent 加多少度 \
-style 扇形樣式 其他選項(-fill …)
*扇形與圓形的產生方式相同,將長方形的內接圓切成扇形顯示,若不加「-start 」、「-extent」參數則預設90度,Tk的0度是水平線(x方向),依照逆時針方向算 得角度。改變扇形樣式要加「-style」參數,可用的選擇:pieslice(扇形,預設值)、 chord(弦弧形)、arc(純弧線)
產生多邊形:.物件名 create polygon 座標群 (至少要3個點,2點不成形)
產生長方形:.物件名 create rectangle [端點1 端點2]
加入文字:font create 字型代號 字型選項(-family … -size …)
.物件名 create text 字串放置位置(座標) -anchor [center/n/w/e/s] \
-font 字型代號 -justify 排版位置 -text ''文字字串''
加入圖片:image create photo 圖片代號 -file 圖檔位置
.物件名 create image 圖片放置位置(座標) -image 圖片代號
*兩點產生橢圓、扇形長方形的示意圖:
使用例:canvas .a -width 300 -height 200
pack .a # 先初始化出繪圖視窗,再加入物件
.a create line 50 50 100 50 100 50 100 100 # 產生兩條線
.a create oval 50 50 150 150 # 產生一圓,中心(100,100),半徑50
.a create arc 50 50 150 150 -start 30 -extent 90 -style chord -fill ''#ff0000''
# 產生一弦弧形(30~120度),用ff0000顏色填滿
image create photo MKC -file /usr/local/pic/iss.gif # 宣告來源路徑
.a create image 100 120 -image MKC # 在(100,120)位置放上圖片