Tix 擴充套件


(還沒有以 "language independent" 的方式重寫, 請忍耐 ...)
用 Tk 建立 GUI 固然比用 C/C++ 方便, 但它所提供的元件還是稍嫌低階. 「Tix 擴充套件」 提供許多更高階的常用元件 (widgets), 例如 File Dialog Box, Tabbed Notebook 等等, 讓程式設計師可以用更短的程式碼建構出複雜的 GUI.
  1. 安裝: 如果你的 Linux/BSD CD 上面沒有, 可以到 rpmfind 搜尋 tix. Windows 使用者請至原始網站下載.
    1. 確定你已安裝 tcl 與 tk 套件 (可檢查 /var/log/packages)
    2. 取得 與你用的版本相同的 slackware 的 tcl source, 按照其提示 configure 就可以了, 不需要編譯與安裝. 也就是說, 在 tcl8.0/unix 目錄底下:
                      ./configure --prefix=/usr --enable-shared
              
      

      對 tk 如法泡製.
    3. 取得 Tix 並編譯: 在 .../Tix4.1.0/unix/tk8.0 目錄下:
                      ./configure --prefix=/usr --enable-shared
                      make > & make.log &
              
      

    4. 安裝 Tix: 在上一層目錄 (.../Tix4.1.0/unix) 下:
                      ./configure --prefix=/usr
                      make install > & install.log [必須以 root 的身份]
              
      

    5. 安裝完畢後, 用 root 的身份 ldconfig 以更新系統的動態連結程式庫資訊. 如果你的 shell 是 csh/tcsh, 還要下 rehash.
  2. 如何學習 Tix: 目前有關 tix 的文件尚未成熟, 必須靠學者自行揣摩.
    1. 在你的系統的 tix 目錄下找到 widget 這個 demo 程式, 先看看 tix 提供了那些元件可以用.
    2. 找找看手冊放在那個目錄下, 經常查閱手冊!
    3. Mark Harrison 的 Tcl/Tk Tools 書中有一單元簡介 Tix.
    4. 若想學習自己建立新的 widget class, 應經常參考 tix 程式庫下的 tix 內建類別原始碼.
  3. 簡單使用範例 (取自 Tcl/Tk Tools)
            tixControl .lawyers -label "Lawyers:" -max 10 -min 0
            .lawyers configure -integer true -step 2
            pack .lawyers
            .lawyers configure -validatecmd evenOnly
            proc evenOnly {value} {
                return [expr $value - ($value % 2)]
            }
            .lawyers subwidgets -all
            .lawyers subwidget entry configure -background yellow
        
    

  4. 觀念與術語
    1. 每個 megawidget (例如上面的 .lawyers) 裡面可能有很多 subwidgets. 手冊中會列出使用者可以用的 subwidget 名稱 (例如 entry). 但是這些列出來的 subwidgets 未必是 mega widget 的直接 children, 所以要靠 megawidget 的 widget command 的 "subwidget" 功能來取得 subwidget 正確的路徑.
    2. container widgets: 專門用來裝使用者提供元件的這類 "容器形" mega widgets, 例如 NoteBook, PanedWindow, ... 使用 container widgets 時要注意不可把自己的小元件直接放入 container 中, 而要透過 subwidget 功能, 放入 containter 的某個 subwidget 中.
    1. 宣告新類別: 用 tixWidgetClass 命令. 注意 tixWidgetClass 後面的類別名稱與 -classname 後面的類別名稱第一個字母大小寫不同.
    2. tixWidgetClass 命令各選項的意義: -superclass 繼承自那個類別; -method 將來因此而產生的 widget commands 可以有那些公開的功能 (簡化使用者呼叫的語法); -flag 在產生 widget 或更改 widget 組態時有那些選項可用 (亦即此類 widgets 有那些屬性); -configspec 各屬性的內定值等詳細資料; -alias 屬性的簡稱.
    3. 三個固定的 widget 起始函數: InitWidgetRec (設定私有變數), ConstructWidget (建立畫面), SetBindings (讓 subwidgets 活起來). 通常第一句話都是 tixChainMethod (想像 OOP 中高階 constructor 會去呼叫低階 constructor).
    4. 成員函數內一般都用 "upvar #0 $w data" 宣告來取得 "本 widget" 的相關資訊.
    5. 只要建立 subwidget, 就要在 $data(...) 中登記. 這樣使用者才可以用 widget command 的 subwidget 功能取得各元件. (見 ConstructWidget)
    6. 處理 configure 的函數: 在相對應的屬性名稱前面加上 "config". 每次屬性值要改變時都會被叫起來.