Geometry Manager


請先閱讀 "骨架程式" 單元當中介紹 geometry manager 的部分.

本頁中單獨的大寫字母代表使用者自行決定的視窗 (W), 距離 (D), 比值 (R), ...

  1. 範例程式
    1. gridder 的 -sticky 選項: tcl 版, perl 版.
    2. 如何用 gridder 安排複雜的畫面: tcl 版, perl 版.
  2. Gridder
    1. 想像用縱橫交錯的直線把 master 分割成 (大小不一定相等) 的小方塊, 把 slaves 依照指定行列的方式放入它的 master widget 中. (如果沒有用下面的參數指定的話) 同一句 grid 命令當中提到的所有 slaves 放在同一列; 每句新的 grid 命令依序指定 master 中的下一列. 左上角為第 0 列第 0 行.
      1. -row N: 指定要把 slaves 放在第 N 列
      2. -column N: 指定要把 slaves 放在第 N 行
      3. -sticky A: 讓 slave 在 gridder 給它的空間中向 A 側延展, 或水平/垂直/全部填滿 gridder 給它的空間.
      4. -rowspan N: 讓 slave 佔有的範圍往右延伸, 共佔 N 列.
      5. -columnspan N: 讓 slvae 佔有的範圍往下延伸, 共佔 N 行.
    2. 使用 grid 的設計步驟:
      1. 找出畫面上各行列的 "最大公因數" (獨佔一格的小元件可視為佔滿整格)
      2. 根據各元件的左上角行列數指定其坐標.
      3. 用 grid configure 的 -rowspan 與 -column span 將需要放大的元件往右下角延伸.
      4. 用 grid columnconfigure ... -weight ... 與 grid rowconfigure ... -weight ... 來設定: 上層視窗放大時, 各行列應該以何種比例放大? (提示: 如果希望所有小方格按照比例放大, 可將各行列的 weight 比值設定成與原來自然大小的比值一樣.)
      [使用 grid 的設計步驟] 圖案
    3. 建立 label 或 entry 時, -width 選項的單位是字元數, 往往和 Tcl/Tk 程式中其他的長度單位不同. 解決辦法之一是使用 grid 的 columnconfigure -minsize 或 rowconfigure -minsize
    4. grid forget W: 把 W 從其 master 中完全移除, 彷彿不曾有過這個 slave 一樣.
    5. grid remove W: 把 W 從其 master 中暫時移除, 但 gridder 依舊記得 W 原來的位置, span 的行列數, sticky 的方向, ... etc. 下次再被 grid 進去時, 不必再指定這些值.
    6. grid info W: 看看 W 與其 master 的關係. 傳回值為字串, 正好可以給 grid configure 當做參數.
    7. grid slaves W: 看看 W 有那些 slaves.
    8. 參考資料:
      1. Mark Harrison & Michael McLennan. Effective Tcl/Tk Programming. Addison-Wesley.
      2. Eric Foster-Johnson. The Grid Layout Manager
      3. Brent Welch. The Grid Geometry Manager
    9. (我個人的結論) gridder 比 packer 容易用...

    以下尚未改寫完成...
  3. Placer
    1. place W ... 或是 place configure W ...
      把 W 這個 widget 依照指定座標的方式放入它的 master widget中 (通常即是它的 parent widget).
      1. -x D: 讓 W 的某一角離 master 的左緣 D
      2. -y D: 讓 W 的某一角離 master 的上緣 D
      3. -relx R: 讓 W 的某一角離 master 的左緣 R (以 master 的寬度為 1)
      4. -rely R: 讓 W 的某一角離 master 的上緣 R (以 master 的高度為 1)
      5. -anchor A: 所謂的 "某一角" 即是指 A. (可以是 nw, n, ne; w, c, e; sw, s, se)
      6. -width D: 要求 W 變成 D 這麼寬
      7. -height D: 要求 W 變成 D 這麼高
      8. -relwidth R: 要求 W 變成 R 這麼寬 (以 master 的寬度為 1)
      9. -relheight R: 要求 W 變成 R 這麼高 (以 master 的高度為 1)
      注意: -x 與 -relx 有相加的效果; -y 與 -rely 有相加的效果.
    2. place forget W: 把 W 從其 mater 中移除.
    3. place info W: 看看 W 與其 master 的關係. 傳回值為字串, 正好可以給 place configure 當做參數.
    4. place slaves W: 看看 W 有那些 slaves.
  4. 作業:
    1. [計算機外觀] 圖案
    2. 寫一個計算機, 外觀如圖. 注意放大時的外觀應如 此圖. 參考答案 (只有外觀, 沒有功能) 可在本頁的 source 中找到.
    3. 寫一個智慧盤遊戲 (m*n 的棋盤上有 1 到 mn-1 這些數字, 及一個空格. 程式把棋盤打亂; 操作者把數字排回去, 但只有空格旁的數字可以移動.)
    4. 設計一個程式說明矩陣的乘法 ( A*B=C 當中, C 的第 i 列第 j 行元素, 是 "A 的第 i 列與 B 的第 j 行對應元素相乘" 之總和.)