#

終於...要開始介紹Tk了。Tk是專門用來繪製視窗元件(widget)的工具,如果你想要製作視窗介面的程式,就要用到Tk。事實上我會喜歡用Tcl有絕大部份是因為Tk,因為它真的太方便了。記得碩士班的時候,學弟把Tcl/Tk移植到ARM的板子上,然後在X Window下做了幾個簡單按鈕。一次meeting學弟把它的成果展示給大家看,顯然大家有驚訝到,然後開始一陣跨獎聲出來了....畢竟,觸碰式螢幕加上自己寫的GUI程式真的滿令人興奮的。當學弟開心的展示完成後,攤開程式碼....不到10行...大家傻了!!。那一次的經歷讓大家知道了一件事實,原來學Tcl/Tk還可以...唬人。雖然內行人會知道porting才是重點,但透過Tk開發GUI的能力確實讓那次的展示加了不少分。唉呀!! 說了很多的廢話,還是進入主題吧!! 這一篇的內容主要在介紹一些關於Tk的觀念。

15.1 視窗元件(Widget)

什麼是視窗元件? 簡單的說任何用來組成視窗介面的物件,就叫視窗元件,例如:按鈕、標籤、清單方塊、下拉選單....等,都是視窗元件。圖15-1~15-3是幾個常見的Tk視窗元件。

圖15-1 Mac下Tk視窗元件的外觀


它在Linux下看起來像這樣:

圖15-2 Linux下Tk視窗元件的外觀


它在Windows下看起來像這樣:

圖15-3 Windows下Tk視窗元件的外觀



15.2 視窗元件命名規則

在之前的文章裡有說過,每一個視窗元件,都需都有一個獨一無二的ID,而且要用點號「.」開頭。其實這種「.」號開頭的元件ID,正式的稱呼是path,中文的意思是「路徑」。那為什麼要叫path呢? 這是因為path除了用來識別widget之外,還有表示階層的意義,下面的文章會說明階層的觀念。

在Tk裡「.」永遠用來表示root(根)視窗,如果你有一個path是.btn的widget,那就表示.btn在顯示時要排放在root視窗裡面。又如果你有一個path叫.btn.lbl的widget,那就表示.btn.lbl要放在.btn的裡面。接下來我們用程式說明這種widget階層式命名觀念。

如果你在命令模式下直接執行wish,你會看到類似下面的圖:

圖15-4 Tk的root視窗


圖中空白的視窗就是root視窗,它是所有widget的根,也就是說所有你建立的widget都算是它的子項目。如果它被關掉的話,其它所有的widget也會一起被關掉,正常的情況下我們只會在結束程式的時候關閉它。接著我們來建立幾個以前用過的widget:



上面的例子我們把按鈕的path設定為.btn,標籤的path設定為.lbl,所以pack會把它們排放在「.」也就是root視窗的內層。另外指定pack命令的-expand及-fill選項,讓.btn及.lbl跟著root視窗放大縮小。程式執行起來像這樣:

圖15-5 在root視窗裡排放元件


現在我們來故意亂玩一下,如果把label的path命名為.btn.lbl看會發生什麼事,注意下方程式的第2行,label的path被我改了,而且這次只讓.btn跟著root視窗放大縮小。



它執行起來像下面的圖片一樣。.btn.lbl被排放在.btn裡面了!! 這件事說明了pack命令會根據widget的path來決定widget到底要放在誰的內層。而事實上除了pack之外Tk還有place及grid兩個排放widget的命令,它們也使用了這樣子的規則。

圖15-6 把widget排放在另一個widget裡面


其實在真正寫程式的時候,不太會像上面,把label排放在button裡面。取而代之的我們會用frame、labelframe、頁籤或是其它容器型的widget來裝載其它的widget。例如:

圖15-7 frame及labelframe


如圖15-7,button1及button2我用一個frame裝了起來,而label及entry我改用labelframe裝了起來。關於這些視窗元件的用法,請大家還不要太在意,因為未來會有詳細的說明。目前我們只要弄清礎widget命名及排放的觀念就行了。

15.3 關於Tk命令

在Tk的命令群裡,只要是用來建立視窗元件的命令,大多都採用像下面這樣子的語法:

Tk命令 path ?選項1 選項值1? ?選項2 選項值2? ... ?選項n 選項值n?

這種語法都是以建立視窗元件的「Tk命令」開頭,例如:button、label、entry...等。接著是視窗元件的路徑path。最後緊接著的是一大堆視窗元件可用的選擇性參數,而且它們都是以一根「-」開頭,像-text、-command、-background...等。由於它們都可以選擇性附加,所以我叫它們做「選項」,就是選擇性項目的縮寫。另外,每一個建立視窗元件的命令,它們都一定會回傳你指定的path,就是說如果你打button .btn -text "hello",那這個命令的回傳值也一定是.btn。事實上每一個用來建立視窗元件的命令都是這樣用的,而且沒有一個例外,所以只要看懂了上面的語法,你就會建立全部的Tk視窗元件了。

當你會建立各種視窗元件後,下一步要做的事就是「熟悉每個視窗元件的選項」。關於這一點,你只能靠多看手冊來熟悉它們。個人的小建議是:

  1. 每天看幾個命令的說明手冊,相信我它們很快就可以看完了。
  2. 當你看完1~2次手冊,對每個命令及它們的選項應該就會有一點印像,這樣就夠了,千萬別去背它們。
  3. 有印像後,每次寫程式前記得打開手冊,邊寫程式邊查手冊。
  4. 最後,多找些小程式練習,這樣會讓你加快命令及選項的熟練度。

到目前為止我們知道path有兩項功能 (1)用來當作視窗元件的識別 (2)給幾合管理命令當作排放的依據。其實它還有第3項功能,只要建立視窗元件成功後,path會被附予控制該視窗元件的能力,簡單的說path會變成一個控制視窗元件本身的命令,舉例來說:



在第1行執行後.txt會變成了一個專門用來控制自己的命令,然後第2行用.txt命令的insert功能來把「Hello Tk!!」插入文字方塊的尾巴。很神奇對吧!! 如果現在還沒辦法體會這個用法,請不要太擔心,因為以後我們會把它用爛....真的。

Theme Design by devolux.org. Converted by Wordpress To Blogger for WP Blogger Themes. Sponsored by iBlogtoBlog
This template is brought to you by : allblogtools.com | Blogger Templates