圖形化使用介面

GUI(Graphic User Interface) – 圖形化使用介面,通常是指視窗操作畫面。 Python 開發 GUI 有兩個套件較常被使用:Tkinter 與 PyQt。兩者的差別為:PyQt為第三方套件,功能較多;Tkinter為 Python 內建的 GUI 套件,功能簡單但效能好。本單元將以 tkinter 為主,介紹如何設計桌面應用程式。

Tkinter 套件

Tkinter 套件是 Python 內建的標準 GUI 設計介面,使用 Tcl/Tk GUI 工具程式,可以用來開發桌面應用程式。

Tkinter 包括了以下幾個主要的模組(Moudle):

檢查 tkinter

開始使用 tkinter 之前,要確認是否可以使用 tkinter 模組,可以在系統的命令列中執行以下指令,若已經安裝好的話,會出現一個簡單的 Tk 示範視窗,並且顯示 tkinter 的版本:

# 測試 Python 的 tkinter 模組
>>> python -m tkinter
tkinter window

建立步驟

撰寫 Tkinter GUI 程式主要有以下三個步驟:

  1. 建立主視窗:設定視窗大小、位置和視窗名稱等
  2. 放入元件:將元件(如:按鈕、文字方塊、選單等)放入視窗中
  3. 實作事件處理函式:設計使用者互動時的事件處理函式(event handler)。例如:當使用者點擊某個按鈕時要觸發什麼行為。

基本視窗範例

首先,建構一個最基本的視窗範例,如下:

# 引入 tkinter 模組
import tkinter as tk

# 建立主視窗 Frame
win = tk.Tk()

# 執行主程式
win.mainloop()
		

實做練習

建立一個高400寬600的視窗,標題顯示你的學號姓名。

視窗元件(widget)

視窗的主要組成元素稱為元件(widget),例如:選單、按鈕...等。tkinter 常用的元件(widget)如下:

參考:Basic WidgetsMore Widgets

佈局管理

佈局管理(layout managers 或 geometry managers)為設定視窗裡面的元件擺放方式,有以下功能:

tkinter 有以下三種佈局管理方式:

這三種佈局管理在同一個主視窗裡,不可以混用!

Pack 佈局管理

pack 是三種佈局管理中最常用的. 另外兩種佈局需要精確指定元件具體的顯示位置, 而 pack 佈局可以指定相對位置, 精確的位置會由 pack 系統自動完成。 這也使得 pack 佈局沒有另外兩種佈局方式靈活,所以 pack 是簡單應用的首選佈局, 比如只是想要將元件水準或垂直的逐個放在一起。

pack() 方法的參數全部都是可有可無的, 沒有傳入參數時, 加入版面的元件以預設值排版, 常用參數如下:

參數

說明

side

排列方向 : TOP (預設), BOTTOM, LEFT, RIGHT

fill

填滿所分配空間之方向 : NONE (預設), X, Y, BOTH

expand

填滿容器 : True/False (預設)

padx/pady

元件邊框與容器之距離 (px,預設=0)

ipadx/ipady

元件內容 (文字/圖像) 與其邊框之距離 (px,預設=0)

anchor

元件在容器中的錨定位置 : e, w, s, n, center (預設), ne, se, sw, nw

Place 佈局管理

Place 佈局管理可以明確指定元件的絕對位置或相對於其他元件的位置. 要使用 Place 佈局, 呼叫元件的 place() 方法就可以了。

此排版法是指定以父容器左上角為原點之座標位置來精確放置元件, 但使用的機會較少, 因為只要某個元件的位置更改, 整個版面中的元件可能都要隨之調整, 通常是用來製作客製化的版面管理員之用。使用語法如下:

元件.place([options])

place 函式的常用參數如下 :

place() 參數

說明

x

相對於視窗左上角之 x 座標

y

相對於視窗左上角之 y 座標

width

指定元件寬度 (px)

height

指定元件高度 (px)

relx

相對於父容器寬度之比率 x 座標 (0~1)

rely

相對於父容器高度之比率 y 座標 (0~1)

relwidth

相對於父容器寬度之比率 (0~1)

relheight

相對於父容器高度之比率(0~1)

anchor

元件在容器中的錨定位置 : E, W, S, N, CENTER (預設), NE, SE, SW, NW

其中 (x, y) 或 (relx, rely) 是必須傳入之定位參數, 雖然沒有傳入任何參數也不會出現錯誤訊息, 但因為缺乏定位資訊, 因此元件也不會出現在視窗上. place() 的詳細介面可輸入下列指令查詢 :

	>>> import tkinter
	>>> help(tkinter.Place)

place() 提供兩種定位法 :

  1. 絕對定位

    以(x, y) 參數指定絕對座標,以 (width, height) 指定絕對大小

  2. 相對定位

    以 (relx, rely) 參數指定相對座標, 以 (relwidth, relheight) 參數指定相對大小

兩者的差別是, 在視窗縮放時, 以絕對定位法放置的元件不會改變其位置與大小; 而以相對定位法放置的元件則會依照相對比率隨之縮放。

Grid 佈局管理

Grid 佈局管理方式是為各個元件指定行號和列號的過程. 不需要為每個格子指定大小, Grid 佈局會自動設置一個合適的大小。 Grid 排版是最容易理解也最好用版面管理員, 適合用來處理較複雜的版面, 它使用類似網頁表格或二維陣列的索引方式來放置元件, 每個網格只能放置一個元件, 但多個網格可用 rowspan 與 columnspan 參數合併鄰近的多個網格來放置一個元件, 其介面如下 :

元件.grid([options])

常用參數如下表 :

 grid() 參數

 說明

 row

 列索引

 column

 行索引

 rowspan

 儲存格合併列數

 columnspan

 儲存格合併行數

 padx/pady

 元件邊框與容器之距離 (px, 預設=1)

 ipadx/ipady

 元件內容 (文字/圖像) 與其邊框之距離 (px, 預設=1)

 sticky

 元件於網格中的錨定位置 : E, W, S, N, CENTER (預設)

其中 row 與 column 都是 0 起始的索引. 一般來說,元件呼叫 grid() 將自己放進容器時應該傳入 row 與 column 參數指定網格索引位置, 否則預設是以 1 行網格來擺放元件. 參數 padx/pady/ipadx/ipady 用法與上面 pack() 的一樣。

grid() 的詳細參數可輸入下列指令查詢 :

>>> import tkinter
>>> help(tkinter.Grid)
	

參考網站