骨架程式


空殼子程式執行畫面 這一篇講義的 framework 範例程式是一個骨架, 一個空殼子, 可以拿來當做其他程式的基礎。

framework
tcl 版 v
nis 版 v
nis/mbvk 混合版 v
mbvk 版 v

本篇講義尚未整理


  1. 範例程式:
    1. path: tcl 版, perl 第 0 版, perl 版
    2. masterslave: tcl 版, perl 版
    3. 骨架程式: tcl 版, perl 版.
    4. pack 的 -fill 與 -expand 選項的效果: tcl 版, perl 版.
  2. 從 widgets 的產生途徑看 widgets 之間的關係:
    1. 若 widget B 是透過 widget A 而產生出來的, 我們就說 A 是 B 的 parent widget; B 是 A 的 child widget.
      tcl perl
      parent frame .a $a = $mw->Frame;
      child button .a.b $b = $a->Button;
    2. 在 tcl/tk 中, 一個 widget 的完整名稱叫做它的 path name (路徑名稱), 例如上例中的 .a.b
      這項資訊在 perl/tk 中可以用 pathname 這個 "所有 widget 共有的 method" 取得. (這類共有的 methods 手冊請見 perldoc Tk::Widget) Perl 使用者亦請參考 "如何有系統地給 widgets 命名?"
    3. 當然從 產生途徑 的角度來看, main widget (也就是 tcl/tk 當中的 . 或 perl/tk 當中用 MainWindow 產生的視窗) 就是所有其他 widgets 的老祖宗. 在 path 範例中, 共有祖孫三代.
  3. 從 widgets 佔據的畫面空間看 widgets 之間的關係
    1. 若 widget B 在畫面上放在 widget A 裡面, 我們就說 A 是 B 的 master widget; B 是 A 的 slave widget.
      誰是誰的 master? 這是由 pack 命令的 -in 參數來決定的.
      tcl perl
      statement pack .b -in .a $b->pack(-in=>$a);
      slave .b $b
      master .a $a
    2. 如果在 pack 一個 widget W 時不指定 -in 參數, 那麼 W 的 master 就內定為 W 的 parent. 所以說: parent 通常就是 master; child 通常就是 slave. 但是像 masterslave 範例中, 除了 main widget 以外的所有六個 widgets 都是 sibling (兄弟姊妹), 可是其中有兩個為另外四個的 masters.
  4. 幾個經常使用的副程式 (並不是真正的 widget classes)
    1. tk_messageBox: 顯示訊息給使用者看, 並傳回使用者按下的鈕. 有好幾種常用的形式, 例如 ok, okcancel, yesnocancel 等等.
    2. tk_getOpenFile: 讓使用者點選檔案名稱並傳回給呼叫者. 傳回的一定是一個既有的檔案.
    3. tk_getSaveFile: 讓使用者點選檔案名稱並傳回給呼叫者. 如果使用者選到一個既有的檔案, tk 會問他是否確定要覆蓋這個既有的檔案. (手冊與 tk_getOpenFile 在一起)
    4. tk_chooseColor: 讓使用者選取顏色並傳回給呼叫者. (tcl 版與 perl 版的畫面差很多)
    perl 使用者請見 Tk::messageBox, Tk::getOpenFile 與 Tk::chooseColor. (fvwm 使用者: 必須設定 DecorateTransient 之後, -title 才會生效.)
  5. 其他:
    1. 一個好習慣: 讓你的程式處理 "關閉程式主視窗" 這個事件. 像是主視窗這類 toplevel 視窗, 它們是由管理桌面其他應用程式的 window manager 來管理的, 不像一般 tk 內部視窗, 是由 geometry manager 在管理的. 因此要接收 "關閉程式主視窗" 這個事件, 要透過與 window manager 的程式介面. 在 tcl/tk 中用 wm protocol (詳見 man n wm); 在 perl/tk 中用 ->protocol (詳見 perldoc Tk::Wm) 通常處理 WM_DELETE_WINDOW 這個事件很簡單, 可以與處理正常 quit 的選單使用同一個副程式.
    2. 注意: 建立 widget (或用 configure 修改) 時的 -padx 與 -pady 指的是 widget 內部的額外空間; 而 pack 時的 -padx 與 -pady 指的是 widget 與它的 mater 之間所留的額外空間. 更一般說來, 不論是何種屬性, 用於建立 widget 或 configure 時的, 都是描述 widget 本身的屬性; 而用於 pack 時的, 則是描述它與 master 之間關係的屬性.