[Part I. GIMP基礎功]

[Part II. 一種效果的誕生]
[Part III. Script-Fu的秘密]



顯示具有 第13章 程式教學 Script-Fu vs. Python-Fu 標籤的文章。 顯示所有文章
顯示具有 第13章 程式教學 Script-Fu vs. Python-Fu 標籤的文章。 顯示所有文章

13.1 Script-Fu 新增影像物件、圖層物件

Script-Fu 訊息視窗
  • 執行[影像] / 濾鏡 / Script-Fu / Console,會出現 Script-Fu 訊息視窗,其下方的文字框內,可輸入欲執行的命令。

  • 上圖展示了Script-Fu 訊息視窗,目前尚未輸入任何指令。


新增影像物件
  • 新增 400 x 300 的影像
(gimp-image-new 400 300 RGB)

  • 這樣是錯誤的,這樣無法指派物件
(img (car (gimp-image-new 400 300 RGB)))

  • 新增 400 x 300 的影像,將影像物件指派給變數 img
(define img (car (gimp-image-new 400 300 RGB)))

  • 新增影像視窗,顯示 img 影像物件
(gimp-display-new img)

  • 載入 PNG 影像檔,並將物件指派給變數 img
(define img (car (file-png-load 1 "~/test.png" "")))

  • 載入 JPEG 影像檔,並將物件指派給變數 img
(define img (car (gimp-file-load 1 "~/test.jpg" "")))

  • 將影像物件 img 儲存在 JPEG 影像檔
(define drw (car (gimp-image-active-drawable img)))
(gimp-file-save 1 img drw "~/test.jpg" "")



將圖層物件加入影像物件,才能在圖層上作畫
  • 若不包含新增顯示視窗 gimp-display-new ,要在圖層上作畫,前置作業至少要三個步驟。

(define width 256)
(define height 256)

;Step 1. 新增影像物件
(define img (car (gimp-image-new width height RGB)))

;Step 2. 新增圖層物件
(define layer-one (car (gimp-layer-new img width height RGB-IMAGE "layer 1" 100 NORMAL-MODE)))

;Step 3. 將圖層物件加入影像物件
(gimp-image-add-layer img layer-one 0)

(gimp-display-new img)

  • 啟動 GIMP Script-fu Console 。
  • 將上面的程式碼,全部選取、複製、再貼入 Script-fu Console 文字框,按下 Enter 。
  • 過一會,就會看到一個影像視窗,內有「空無一物」的圖層。
  • 別小看「空無一物」的圖層,要作畫、填圖、著色,都要先有它才行得通。

13.2 Python-Fu 新增影像物件、圖層物件

Python-Fu 訊息視窗
  • 承接前節 Script-fu 的練習示範,改用 Python-Fu 示範新增影像物件、新增圖層物件。
  • 執行[影像] / 濾鏡 / Python-Fu / Console,會出現 Python-Fu 訊息視窗,在提示符號 >>> 之後,可輸入欲執行的命令。

  • 上圖展示了 Python-Fu 訊息視窗,目前尚未輸入任何指令。
  • 除了用於 GIMP 影像處理的自動化, Python-Fu 訊息視窗,也可執行一些基本的 Python 功能,例如,加減乘除的計算。


新增影像物件
  • 新增 400 x 300 的影像
pdb.gimp_image_new(400, 300, RGB)

  • 新增 400 x 300 的影像,將影像物件指派給變數 img
img = pdb.gimp_image_new(400, 300, RGB)

  • 新增影像視窗,顯示 img 影像物件
pdb.gimp_display_new(img)

  • 載入 PNG 影像檔,並將物件指派給變數 img
img = pdb.file_png_load("/tmp/test.png", "")
pdb.gimp_display_new(img)

  • 載入 JPEG 影像檔,並將物件指派給變數 img
img =pdb.gimp_file_load("/tmp/test.jpg", "")
pdb.gimp_display_new(img)

  • 將影像物件 img 儲存在 JPEG 影像檔
drw = pdb. gimp_image_active_drawable(img)
pdb.gimp_file_save(img, drw, "/tmp/test.jpg", "")



將圖層物件加入影像物件,才能在圖層上作畫
  • 若不包含新增顯示視窗 pdb.gimp_display_new ,要在圖層上作畫,前置作業至少要三個步驟。
width = 256
height = 256

#Step 1. 新增影像物件
img = pdb.gimp_image_new(width, height, RGB)

#Step 2. 新增圖層物件
layer_one = pdb.gimp_layer_new(img, width, height, RGB_IMAGE, "layer 1", 100, NORMAL_MODE)

#Step 3. 將圖層物件加入影像物件
pdb.gimp_image_add_layer(img, layer_one, 0)

pdb.gimp_display_new(img)

  • 啟動 GIMP Python Console
  • 將上面的程式碼,全部選取、複製、再貼到 Python Console 提示符號 >>> 之後,按下 Enter 。
  • 過一會,就會看到一個影像視窗,內有「空無一物」的圖層。
  • 別小看「空無一物」的圖層,要作畫、填圖、著色,都要先有它才行得通。

13.3 Script-Fu 著色與描邊

填色至少要三個步驟
  • 本節承接前面兩節的內容。

  • 下面的程式碼,分成三大部份:
    • 著色與描邊,要先準備好新的影像、新的圖層。
    • 填上特定顏色,在指定的範圍內,至少要三個步驟。
    • 畫出特定顏色、特定筆觸的邊框,至少要四個步驟。

(define width 256)
(define height 256)
(define img (car (gimp-image-new width height RGB)))

(define layer-one (car (gimp-layer-new img width height RGB-IMAGE "layer 1" 100 NORMAL-MODE)))
(gimp-image-add-layer img layer-one 0)

(gimp-display-new img)


# 預設的筆刷 Circle (11),將它設為 Circle (03)
pdb.gimp_context_set_brush("Circle (03)")

;----------------------------------------

;Step 1. 設定前景顏色或設定背景顏色
(gimp-context-set-background '(255 0 0))

;也可能會有設定筆刷、設定漸層的步驟

;Step 2. 指定作用的區域,特定的圖層或特定選取區域
(gimp-selection-all img)

;Step 3. 使用繪圖工具,著色、填圖、或描繪
(gimp-edit-fill layer-one BACKGROUND-FILL)

;----------------------------------------

;Step 1. 設定顏色
(gimp-context-set-foreground '(0 0 0))

;Step 2. 縮小選取區域
(gimp-selection-shrink img 10)

;Step 3. 依選取區域,描上黑色的邊框
(gimp-edit-stroke layer-one)

;----------------------------------------

(gimp-selection-none img) ;釋放選取區域


;Step 1. 設定顏色
(gimp-context-set-foreground '(0 255 0))

;Step 2. 設定筆刷
(gimp-context-set-brush "Circle (03)")

;Step 3. 設定選取範圍
(gimp-rect-select img 50 50 50 50 0 TRUE 4)

;Step 4. 描邊
(gimp-edit-stroke layer-one)

;----------------------------------------

(gimp-selection-none img)

; 繼續使用相同的筆刷與前景色

(gimp-rect-select img 150 150 50 50 0 TRUE 4)

(gimp-edit-stroke layer-one)

(gimp-selection-none img)

  • 啟動 GIMP Script-fu Console
  • 將前面的程式碼,依次序,全部選取、複製、再貼入 Script-fu Console 文字框,按下 Enter 。
  • 過一會,就會看到結果圖,如下圖所示。

13.4 Python-Fu 著色與描邊

填色至少要三個步驟
  • 承接前節 Script-fu 的練習示範,改用 Python-Fu 示範著色、描邊。

  • 下面的程式碼,分成三大部份:
    • 首先,仍舊是要準備好新的影像、新的圖層。
    • 填上特定顏色,在指定的範圍內,至少要三個步驟。
    • 畫出特定顏色、特定筆觸的邊框,至少要四個步驟。

width = 256
height = 256
img = pdb.gimp_image_new(width, height, RGB)

layer_one = pdb.gimp_layer_new(img, width, height, RGB_IMAGE, "layer 1", 100, NORMAL_MODE)
pdb.gimp_image_add_layer(img, layer_one, 0)

pdb.gimp_display_new(img)


# 預設的筆刷 Circle(11),將它設為 Circle(03)
#pdb.gimp_context_set_brush("Circle 03")

#----------------------------------------

#Step 1. 設定前景顏色或設定背景顏色
pdb.gimp_context_set_background((255, 0, 0))

#也可能會有設定筆刷、設定漸層的步驟

#Step 2. 指定作用的區域,特定的圖層或特定選取區域
pdb.gimp_selection_all(img)

#Step 3. 使用繪圖工具,著色、填圖、或描繪
pdb.gimp_edit_fill(layer_one, BACKGROUND_FILL)

#----------------------------------------

#Step 1. 設定顏色
pdb.gimp_context_set_foreground((0, 0, 0))

#Step 2. 縮小選取區域
pdb.gimp_selection_shrink(img, 10)

#Step 3. 依選取區域,描上黑色的邊框
pdb.gimp_edit_stroke(layer_one)

#----------------------------------------

pdb.gimp_selection_none(img) #釋放選取區域


#Step 1. 設定顏色
pdb.gimp_context_set_foreground((0, 255, 0))

#Step 2. 設定筆刷
#pdb.gimp_context_set_brush("Circle 03")

#Step 3. 設定選取範圍
pdb.gimp_rect_select(img, 50, 50, 50, 50, 0, TRUE, 4)

#Step 4. 描邊
pdb.gimp_edit_stroke(layer_one)

#----------------------------------------

pdb.gimp_selection_none(img)

# 繼續使用相同的筆刷與前景色

pdb.gimp_rect_select(img, 150, 150, 50, 50, 0, TRUE, 4)

pdb.gimp_edit_stroke(layer_one)

pdb.gimp_selection_none(img)

  • 啟動 GIMP Python Console
  • 將前面的程式碼,依次序,全部選取、複製、再貼到 Python Console 提示符號 >>> 之後,按下 Enter 。
  • 過一會,就會看到結果圖,如下圖所示。

13.5 Script-Fu Code 與 GIMP 介面視窗之互動

你可以混合 Script-Fu Code 與 介面視窗的操作
  • 互動,意指一部分操作 GIMP 介面視窗,一部分由 Script-Fu Code 完成。
  • 在 GIMP 之中,大多數的操作,都可用程式碼來完成。
  • 但是,不一定要寫成一個「完整的 Script-Fu 的 scm 檔案」,不一定要完全自動化整套的影像處理流程。
  • 以「開檔」為例
    • 開啟影像檔,可透過介面視窗的選單,與對話盒的操作。
    • 開啟影像檔,也可使用 Script-Fu Code 。
    • 開檔,其對應的函式為 gimp-file-load 。
  • 半自動化的操作方式
    • 也許,可以用 gimp-file-load 函式載入影像檔,再透過 GIMP 介面視窗的操作來畫圖。
    • 也許,可以用 GIMP 介面視窗開啟影像檔,產生一個形狀特殊的選取區域,再利用 Script-Fu Code 連續執行幾個濾鏡來潤飾影像。
  • 對於,初學 Script-Fu 的人,這種半自動化的操作方式,更容易體會 Script-Fu 優點,更容易學習 Script-Fu 。


在 GIMP 之中,什麼是「物件」?
  • 類似於「物件導向程式設計」對於物件的定義,物件包裹了一些資料變數與一組相關的操作函式。
  • 在 GIMP 之中,影像、色版、圖層、選取區域、遮罩,這些東西都可稱為物件。
  • 如果要用 Script-Fu Code 來控制 GIMP 介面視窗的操作,至少要知道影像物件的 id 。


Scheme 最重要的資料結構是 list
  • GIMP 對各種物件的 id 都採用流水號的編排,從 1 開始編號 。
  • Script-Fu 所用的與語言是 Scheme。
  • Scheme 最重要的資料結構 list。
  • 但是 Scheme list 資料索引值是從 0 開始增加的 。


要會區別 atom 與 list ,不然,很容易寫出錯誤的程式碼
  • list 可以是空的,也可以只有一個 atom 。
  • 一個 list 可以儲存很多 atom 。
  • 甚至, list 內部還可儲存其它 list 的資料結構。
  • 下面是錯誤的,因為回傳值是一個 list 。
    • (define drw (gimp-image-get-active-layer img))
    • 回傳值是 list 內部包含了一個「圖層 id」
  • 下面是正確的,car 函數會取出 list 的頭(第一個元素)。
    • (define drw (car (gimp-image-get-active-layer img)))
    • 「圖層 id」是正整數 1 、2 、3 ......


取得視窗所承載的影像 id
  • 以簡單的方形黑色塊,示範 id 的取得。

  • 從影像視窗的標題列得知,第一張開啟的影像編號為 1.0

  • 重複開啟相同的影像,編號為 2.0


  • 代表目前開啟兩張影像檔(雖然是相同的檔案),有兩個影像物件。


取得欲作用的圖層 id
  • JPEG 檔只有一個圖層。
  • 在 Script-Fu Console 的文字輸入框內
    • 鍵入 (define drw (gimp-image-get-active-layer 1))
    • 就可將取得「 影像 id 為 1」 的「 active 圖層 id」
  • active 是指目前選到的、會發生作用的、會發生作用的圖層。


用視窗介面開啟檔案,再用程式碼施加濾鏡效果
  • 通常,都是用視窗介面的選單,來執行濾鏡的功能,以此,施加濾鏡效果。
  • 在此示範,用 Script-Fu Code 連續施加兩種濾鏡的效果。
  • 開啟測試的圖檔,假設受作用的影像其 id 為 1 。
  • 將下列的程式碼,複製後,貼入 Script-Fu Console 輸入框 。
  • 按下 Enter 鍵,就會看到結果圖,如下所示。

(define img 1) ;
(define drw (car (gimp-image-get-active-layer img)))
(define blur-radius 10)
(define cell-size 10)
(plug-in-gauss-iir RUN-NONINTERACTIVE img drw blur-radius 1 1)
(plug-in-newsprint RUN-NONINTERACTIVE img drw cell-size 0 0 45.0 3 45.0 0 45.0 0 45.0 0 3)

13.6 Python-Fu Code 與 GIMP 介面視窗之互動

你可以混合 Python-Fu Code 與介面視窗的操作
  • 互動,意指一部分操作 GIMP 介面視窗,一部分由 Python-Fu Code 完成。
  • 接續前節,改用 Python-Fu Code 來說明。
  • 以半自動化的操作方式,連續施加兩種濾鏡的效果。


在 GIMP 之中,什麼是「物件」?
  • 類似於「物件導向程式設計」對於物件的定義,物件包裹了一些資料變數與一組相關的操作函式。
  • 在 GIMP 之中,影像、色版、圖層、選取區域、遮罩,這些東西都可稱為物件。
  • 如果要用 Python-Fu Code 來控制 GIMP 介面視窗的操作,至少要知道影像物件的 reference 。


Python 最重要的資料結構是 list
  • Python 最重要的資料結構 list 。
  • Python 的 list 類似於 C 的 array ,從都透過索引值來讀寫內容。
  • Python list 資料索引值是從 0 開始增加的 。


要會區別「影像 id」與「影像 reference」
  • Script-Fu 用物件的 id , 控制物件的操作, id 為流水號,從 1 開始編號 。
  • Python-Fu 用物件的 reference , 控制物件的操作。
  • Python 的變數名稱,就代表了物件的 reference 。
  • Python-Fu 之中,要取得影像視窗的控制權,不能透過 id 影像,而是要透過影像物件的 reference 。
img_array = gimp.image_list()
img = img_array[0]
drw = pdb.gimp_image_get_active_layer(img)
  • gimp.image_list() 回傳一個 list ,內含目前所有的影像物件的 reference 。
  • img = img_array[0] 將最新的影像物件的 reference 儲存在 img 變數。



取得視窗所承載的影像 id
  • 以簡單的方形黑色塊,觀察影像物件的 reference 。

  • 從影像視窗的標題列得知,第一張開啟的影像編號為 1.0

  • 重複開啟相同的影像,編號為 2.0

>>> gimp.image_list()
[<gimp.Image 'test_square_.jpg'>, <gimp.Image 'test_square_.jpg'>]
>>> img_array = gimp.image_list()
>>> img_array[0]
<gimp.Image 'test_square_.jpg'>
>>> img_array[1]
<gimp.Image 'test_square_.jpg'>

  • 代表目前開啟兩張影像檔,雖然是相同的檔案 test_square_.jpg
  • 有兩個影像物件 img_array[0] 與 img_array[1]


取得欲作用的圖層 id
  • JPEG 檔只有一個圖層。
  • 先確定 img_array[0] 代表那張影像檔。
  • 在 Python Console 的提示符號 >>> 之後,鍵入
img_array = gimp.image_list()
img = img_array[0]
drw = pdb.gimp_image_get_active_layer(img)
  • 就可將取得「 active 圖層的 reference」
  • active 是指目前選到的、會發生作用的、會發生作用的圖層。


用視窗介面開啟檔案,再用程式碼施加濾鏡效果
  • 通常,都是用視窗介面的選單,來執行濾鏡的功能,以此,施加濾鏡效果。
  • 在此示範,用 Python-Fu Code 連續施加兩種濾鏡的效果。
  • 開啟測試的圖檔,假設它是最新開啟的圖檔 。
  • 將下列的程式碼,複製後,再貼到 GIMP Python Console 提示符號 >>> 之後。
  • 按下 Enter 鍵,就會看到結果圖,如下所示。

img_array = gimp.image_list()
img = img_array[0]
drw = pdb.gimp_image_get_active_layer(img)
blur_radius = 10
cell_size = 10

pdb.plug_in_gauss_iir(img, drw, blur_radius, 1, 1)
pdb.plug_in_newsprint(img, drw, cell_size, 0, 0, 45.0, 3, 45.0, 0, 45.0, 0, 45.0, 0, 3)

13.7 Scheme 的「可讀性」與 Script-Fu 的正名

正名 Rectification of names
  • 名,也指名份、地位, Script-Fu 的名份,這一點會在「21.3 ......我有惑......」進一步地論述。
  • 名,也指命名,名不正則言不順,言不順則事不成。


  • 正名,是政治學上的用語。
  • 正,有糾正之意。
  • 將「正名」這一詞彙用在電腦科學上,用於彰顯電腦術語翻譯的問題,與撰寫程式時命名的問題。



Script-Fu 必也分號乎
  • 分號代表註解,而檔頭通常都有數十行以上的註解。
  • 無論是甚麼程式語言,撰寫程式時,都要注意「可讀性」的議題,都要注意如何讓程式易讀、易懂、易維護。


  • Script-Fu 程式要容易閱讀與維護,要注意下列四項要領:
    • 命名:要讓變數的命名遵守固定的規則,要讓函數的命名遵守固定的規則。
    • 註解: Script-Fu 的註解是用「分號」來表明, Script-Fu 的檔頭通常都有註解。
    • 空行: Script-Fu 程式碼為了方便閱讀,有些地方使用完全空白的一行,以此突顯特定的一行程式碼,或以此區隔特定的一段程式碼。
    • 對齊: Script-Fu 程式碼為了方便閱讀,有些地方會加上很多空白,來幫助上下兩行文字的對齊,但是在這一系列的文章中呈現程式碼時,省略了很多空白,與原本的檔案(可參考前一節的圖)呈現的方式不一樣。

  • 廣義來看,空行、空白算是一種「無言」的註解,其功效不言而喻。


Script-Fu 必也括號乎
  • Script-Fu 的特色是,括號很多。
  • Scheme 語言的運算式為前序(prefix)運算式。這是造成 Scheme 語言大量使用括號的原因之一。
  • 撰寫 Script-Fu 時,要注意括號的對齊。若把內容移除,只剩括號,會看到括號中又有括號((())) ,好像呼喊的聲音,向外擴散。


  • 下圖顯示括號的對齊,括號內的東西,是屬於 let* 函數的參數。



Script-Fu 必也正名乎,撰寫程式時命名的問題
  • 函式:通常以 gimp 或 plug-in 開頭。
    • 一旦仔細研究 Script-Fu ,就會知道 GIMP 內部的程序(函式)的命名規則。
    • 操作英文介面,會比較容易學習 Script-Fu 程式的撰寫,因為程式要用英文撰寫。
    • 例如,gimp-edit-clear 函式,對應到選單介面的位置
      • 中文選單是 [影像] / 編輯 / 清除
      • 英文選單是 [Image] / Edit / Clear
  • 變數:變數的命名,也有一些固定的規則。
    • img 、image 表示影像變數。
    • 一支 Script-Fu 程式,通常只會處理一個影像變數,但可能要處理三、四個圖層。
    • 例如, alien-glow-logo.scm 三個圖層變數的名稱,為 logo-layer 、low-layer 、bg-layer 。
  • 參數值的傳遞:要命名的東西真的很多。
    • 每一個對話盒的控制元件,都需要命名,都需要一個變數,來接收與傳遞參數值,都需要解說的字詞,來代表該控制元件。
    • 程式越複雜,就需要花更多心思,替變數取一個好名字。



Script-Fu 必也正名乎, 翻譯的問題與 Script-Fu 的字義
  • 電腦術語的翻譯,一直存在著同名異詞、異名同詞的問題。
  • 以及,一個詞彙過度使用的問題,因此讓中文譯詞鑑別度不夠。
  • 導致了若要正確表達某個概念,有時要用譯詞的英文原文。


  • Script:電腦領域裡,Script 通常是指 Shell Scripts 。
    • 關於 Shell Scripts的功用,可參考鳥哥「 Shell Script 」的文章。
    • 在 UNIX 系統與類 UNIX 系統, Shell Scripts 是一堆系統指令的集合,加上 Shell 所提供的一些功能。
      • Bourne Shell 與 C Shell 是常見的 Shell 。
      • 也可使用 Perl 或 Python 來管理UNIX系統。
      • Perl 或 Python 所撰寫的程式碼也可稱為 Scripts 。
    • 推廣這樣的定義,直譯式的語言,所撰寫的程式碼,也可稱為 Scripts 。
      • 例如,Flash 的 ActionScript 。 ActionScript ,顧名思義,是一堆「描述動作」 指令的集合。
      • MS Office 的 VBScript 是用 Visual Basic 語言撰寫的 Script ,可讓一些文書、試算表處理的工作自動化。
      • 同理, Script-Fu 是一堆「處理影像」 指令的集合。



Script 的譯稱, Procedure 的譯稱

  1. 對於 Script 一詞,可採用「命令稿」的稱呼,其實它也可稱為程式碼、指令碼。
  2. 請先閱讀「維基百科」對子程式、程序的說明。
  3. Procedure 與 Function :引用維基百科的詞條,只是想說明,在這一系列的 Script-Fu 文章中,沒有區別 Procedure 與 Function 的差異,因為在英文的文獻中,有時,也沒有區別 Procedure 與 Function 的差異。
  4. 在這一系列的文章中,程序( Procedure )一詞只用來描述程序資料庫( Procedure Database),對於程序資料庫內的「程序」,在文中,都稱為函式或函數。
  5. 當我認真研究程序( Procedure )一詞,我覺得,英文的敘述,英文的解釋,比較精準。


「維基百科」對子程式、程序的說明

維基百科對子程式(Subroutine)的定義
In computer science, a subroutine or subprogram (also called procedure, method, function, or routine) is a portion of code within a larger program, which performs a specific task and is relatively independent of the remaining code.


中文維基百科對子程式(Subroutine)一詞的解說
在電腦科學中,作為更大的程式的一部分,一個子程式(函式、過程,或者是子常式)是完成一項特定任務的代碼序列,它由一個或多個語句塊組成。這些代碼通常被整合為軟體函式庫。
具有相關性語句的集合,一般會有輸入參數並有返回值,提供對過程的封裝和細節的隱藏。
函式在程序導向的語言中已經出現。是結構體和類的前身。本身就是對具有相關性語句的歸類和對某過程的抽象。


中文維基百科對程序( Procedure )一詞的解說
程序在香港和台灣即是英文 procedure 的中文譯名,在大陸於電腦科學、電腦工程、電子工程、電機工程、機器人工程學、機械工程領域中的英文術語 program 的中文譯名也是程序,在港台譯造程式,而程式語言中的 procedure 在大陸譯造過程,在港台和其他領域一樣譯造程序。

當程序為 procedure 的譯名時,一個程序即是特定的一系列動作、行動或操作,而這些活動、動作或操作必須被執行於相同方式以為了在相同環境下恆常得出相同的結果(例如緊急應變程序)。不太精確地說,程序可以指一序列的活動、作業、步驟、決斷、計算和工序,當它們保證依照嚴格規定的順序發生時即產生所述的後果、產品或局面。一個程序通常引致一個改變。

13.8 Python 的「可讀性」與 Python-Fu 的正名

Python-Fu 必也註解乎
  • 井號代表註解,而檔頭通常都有數十行以上的註解。
  • 無論是甚麼程式語言,撰寫程式時,都要注意「可讀性」的議題,都要注意如何讓程式易讀、易懂、易維護。


  • Python 程式要容易閱讀與維護,要注意下列四項要領:
    • 命名:要讓變數的命名遵守固定的規則,要讓函數的命名遵守固定的規則。
    • 註解: Python 的註解是用「井號」來表明, Python 的檔頭通常都有註解。
    • 空行: Python 程式碼為了方便閱讀,有些地方使用完全空白的一行,以此突顯特定的一行程式碼,或以此區隔特定的一段程式碼。
    • 對齊: Python 程式碼嚴格規定了對齊的方式。
      • 多數的程式語言,撰寫時,為了方便閱讀,有些地方會加上很多空白,來幫助上下兩行文字的對齊。
      • 對齊 + 空行,是達成縮排機制的方式。
      • 請注意,Python 的縮排是強制的 ,縮排錯誤程式,是無法執行的。


  • 廣義來看,空行、空白算是一種「無言」的註解,其功效不言而喻。


Python-Fu 必也換行乎
  • Python 的特色是「縮排」,以行為單位,區隔不同的敘述(statement)。
  • 以行與行之間的對齊,表示相同區塊(block)的敘述。


Python-Fu 必也正名乎
  • 名,指名份、地位。
    • Python-Fu 的名份與地位,與 Script-Fu 息息相關。
    • Python-Fu 是相對於 Script-Fu ,Python-Fu 的出現,主要是因為,用戶對 Scheme 語法的不熟悉。
    • 因此, Python-Fu與 Script-Fu 在架構上是相同的,只有語法有差異。
    • 要撰寫 Python-Fu ,仍舊需要 Python 物件導向的知識,只是為了讓 Python-Fu與 Script-Fu 架構盡量接近,盡量不要使用 Python-Fu 物件導向的語法。


  • 名,也指命名,名不正則言不順,言不順則事不成。


  • 函式:通常以 pdb.gimp 或 pdb.plug_in 開頭。
    • 一旦仔細研究 Python-Fu ,就會知道 GIMP 內部的程序(函式)的命名規則。
    • 操作英文介面,會比較容易學習 Python-Fu 程式的撰寫,因為程式要用英文撰寫。
    • 例如,pdb.gimp_edit_clear 函式,對應到選單介面的位置
      • 中文選單是 [影像] / 編輯 / 清除
      • 英文選單是 [Image] / Edit / Clear
  • 變數:變數的命名,也有一些固定的規則。
    • img 、image 表示影像變數。
    • 一支 Python 程式,通常只會處理一個影像變數,但可能要處理三、四個圖層。
    • 例如, alien-glow-logo.scm ,改為 Python-Fu 的程式之後,三個圖層變數的名稱,為 logo_layer 、low_layer 、bg_layer 。
  • 參數值的傳遞:要命名的東西真的很多。
    • 每一個對話盒的控制元件,都需要命名,都需要一個變數,來接收與傳遞參數值,都需要解說的字詞,來代表該控制元件。
    • 程式越複雜,就需要花更多心思,替變數取一個好名字。