close

Tcl/Tk學習筆記

整理者:海洋大學    楊善文

文件授權:自由授權(允許自由散佈、修改、重製、使用無任何限制)

文件版本:2009.09.30

Tcl/Tk官方網站:http://www.tcl.tk/

 tcl   

這是從這兩份文件資源學習而來的筆記,部份功能筆者還未成功試出來,所以原作部份內容筆者無法做紀錄,直到摸索成功後才有辦法加進此筆記內,書本的章節後半段也還沒看完,目前中文筆記份量只有這些。

閱讀原作:

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. 1.      incr      a      # 對a 變數內含值加一
  2. 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. 1.      pack  .a  .b  .c  -side  top                # 左圖,產生三個長度不一的按鈕
  2. 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)位置放上圖片


下載文件Tcl/Tk文件

下載

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 LittleChoCho 的頭像
    LittleChoCho

    宇宇的異想世界

    LittleChoCho 發表在 痞客邦 留言(0) 人氣()