Python 入門指南 5.0
單元 29 - 認識 Tk
標準程式庫 (standard library) 中的圖形介面模組 (module) 為 Tk ,模組名稱為 tkinter , Tk 在國外已經發展的相當成熟,許多程式語言 (programming language) 也都直接內建 Tk
Tk 原本是另一個程式語言 Tcl 撰寫的擴充套件,由於開放原始碼及跨平台的特性,因此被很多程式語言內建到標準程式庫中。
我們先來看看製作 Tk 視窗的步驟
- 建立 Tk 應用物件;
- 加入視窗元件;
- 設定版面佈局;
- 設定視窗元件的排版;
- 設定視窗元件互動的事件;
- Tk 應用物件呼叫 mainloop() 方法。
以上步驟 4 跟步驟 5 並非必須的, Tk 有預設的視窗元件排版方式,此外如果不替視窗元件設定互動的事件,例如按鈕好了,使用者按下沒有跟事件連結的按鈕,按下的同時會顯示預設的動畫,但除了預設動畫之外, GUI 並不會執行任何任務。
基本上 Tk 視窗是運作在 Tk 應用物件之上,這個應用物件就是建立視窗物件,然後要在視窗物件加入視窗元件,接著設定版面佈局,也就是版面管理 (layout management) ,這需要設定幾何版面管理員 (geometry manager) , Tk 有以下三種幾何版面管理員
版面管理員名稱 | 說明 |
---|---|
包裹版面管理員 | 利用 pack() 方法由程式自動安排每個元件的位置。 |
定位版面管理員 | 利用 place() 方法自訂每個元件的座標。 |
格子版面管理員 | 利用 grid() 方法用表格的方式安排每個元件,須指定元件所在的格數。 |
這邊視窗元件先以 Label 為例, Label 就是文字標籤,以下先示範包裹版面管理員的程式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | # 從標準程式庫中引入 Tk 的所有內容
from tkinter import *
# 建立 Tk 應用物件
root = Tk()
# 設定視窗標題
root.title("包裹版面管理員")
# 加入視窗元件文字標籤
text = Label(root, text="Hello World!",
width="30", height="5",
bg="black", fg="white")
# 使用包裹版面管理員
text.pack()
# 呼叫維持視窗運作的 mainloop()
root.mainloop()
# 檔名: tk_demo01.py
# 說明:《Python入門指南》的範例程式
# 網站: http://kaiching.org
# 作者: 張凱慶
# 時間: 2023 年 6 月
|
首先引入 tkinter 模組,這裡用 from 然後 import 加上星號表示引入 tkinter 的所有定義
2 | from tkinter import *
|
下面進入步驟 1 ,也就是建立 Tk 應用物件
5 | root = Tk()
|
底下這一行是設定視窗標題
7 | root.title("包裹版面管理員")
|
步驟 2 加入視窗元件,這裡視窗元件直接是一個 Label
9 10 11 | text = Label(root, text="Hello World!",
width="30", height="5",
bg="black", fg="white")
|
Label() 的第一個參數以 root ,表示這個視窗元件 text 為 Tk 應用物件 root 的視窗元件,注意後面每一個參數設定都是參數名稱加上指派運算子,然後是設定值,例如
| text="Hello World!",
|
這叫做關鍵字引數 (keyword argument) ,用關鍵字引數來設定參數值就不需要考慮參數順序。這裡 text 表示文字標籤要顯示的文字,此為 "Hello World!" , width 為寬,單位為行數, height 為高,單位為列數, bg 為背景顏色, "black" 為黑色, fg 為前景顏色,也就是文字顏色,這裡 "white" 為白色。
繼續呼叫 pack() 方法就是使用包裹版面管理員,這是步驟 3 的部分,程式會自動調整 Label 於視窗上的位置
13 | text.pack()
|
這個程式只做示範用,有關步驟 4 設定視窗元件的排版在單元 32 - 視窗元件的排版及樣式主題會介紹,至於設定事件方法在是在單元 33 - C 的部分與設定 command 再做介紹。
最後步驟 6 ,由 Tk 物件呼叫 mainloop() 方法, mainloop() 方法的作用是維持視窗在螢幕上顯示
15 | root.mainloop()
|
執行同樣使用 python 指令
$ python tk_demo01.py |
按下 Enter 鍵就會出現如下視窗
如要結束執行,請按視窗的關閉按鈕,就會回到命令列並且跳到下一個提示字元。
以下示範定位版面管理員的程式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | # 從標準程式庫中引入 Tk 的所有內容
from tkinter import *
# 建立 Tk 應用物件
root = Tk()
# 設定視窗標題
root.title("定位版面管理員")
# 設定視窗尺寸
root.geometry("276x86")
# 加入視窗元件文字標籤
text = Label(root, text="Hello World!",
width="30", height="5",
bg="black", fg="white")
# 設定文字標籤的起始位置
text.place(x=0, y=0)
# 呼叫維持視窗運作的 mainloop()
root.mainloop()
# 檔名: tk_demo02.py
# 說明:《Python入門指南》的範例程式
# 網站: http://kaiching.org
# 作者: 張凱慶
# 時間: 2023 年 6 月
|
先注意到 Tk 應用物件先呼叫 geometry() 方法設定視窗尺寸,這裡採用 "276x86" ,這會跟寬度 "30" ,高 "5" 的文字標籤一樣大
9 | root.geometry("276x86")
|
如果不設定視窗尺寸的話, root 會直接套用預設的正方形視窗尺寸。
設定完 Label 的 text 變數後, text 再呼叫 place() 方法,並且設定在視窗中的起始座標 x 及 y 的值
15 | text.place(x=0, y=0)
|
視窗的座標原點在左上角的地方,因此設定成原點會是從左上角開始放置 Label 的文字標籤,往下為 y 的正值,往右為 x 的正值。執行程式,啟動的視窗如下圖
絕大多數的圖形使用者介面程式庫的座標原點都在左上角。
以下示範格子版面管理員的程式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | # 從標準程式庫中引入 Tk 的所有內容
from tkinter import *
# 建立 Tk 應用物件
root = Tk()
# 設定視窗標題
root.title("格子版面管理員")
# 加入視窗元件文字標籤
text = Label(root, text="Hello World!",
width="30", height="5",
bg="black", fg="white")
# 設定文字標籤在第幾列第幾欄
text.grid(row=0, column=0)
# 呼叫維持視窗運作的 mainloop()
root.mainloop()
# 檔名: tk_demo03.py
# 說明:《Python入門指南》的範例程式
# 網站: http://kaiching.org
# 作者: 張凱慶
# 時間: 2023 年 6 月
|
格子版面管理員是利用 grid() 設定視窗元件在視窗中在哪一格,其中 row 為從上數下來的第幾列, column 為從左到右數過去的第幾行
13 | text.grid(row=0, column=0)
|
這裡按習慣把 row 稱列, column 稱行,也就是橫列直行,不過行跟列其實是種習慣稱法,例如講「這一行程式碼」中的行是指橫行,所以關於「行」跟「列」需要理解的是分別指的是橫或直,倒是沒有一定強迫哪一個要直或哪一個要橫。
執行程式,啟動的視窗如下圖
以上三組程式跑出同樣的視窗,在這樣的小程式很容易做到,然而如果要加入更多視窗元件的話,繼續用包裹版面管理員難以控制,定位版面管理員的設定會很繁複,就是需要仔細計算每個視窗元件的尺寸跟座標,反而格子版面管理員的設定相對簡單,因此我們將用格子版面管理員來進行 GUI 的版面編排。
Tk 可能不會是 Python 設計 GUI 軟體最好的選擇,但是 Tk 直接內建在標準程式庫,所直接用 Tk 來製作 GUI 軟體是比較方便的,我們在下一篇會正式介紹 GUI ,並使用 Tk 替 Encrypt 類別製作 GUI 軟體。
中英文術語對照 | |
---|---|
標準程式庫 | standard library |
模組 | module |
程式語言 | programming language |
版面管理 | layout management |
幾何版面管理員 | geometry manager |
關鍵字引數 | keyword argument |
重點整理 |
---|
1. 標準模組庫直接整合 Tk ,首先認識有三種版面管理,分別是定位版面管理員、包裹版面管理員、格子版面管理員,其次要認識有哪些視窗元件。 |
2. 包裹版面管理員適合視窗元件少的小程式使用。 |
3. 定位版面管理員須自行定義每個視窗元件在視窗中的座標。 |
4. 格子版面管理員將視窗分成格子,然後將視窗元件放入指定的格子中。 |
問題與討論 |
---|
1. 試著比較 Tk 的三種幾何版面管理員的差別,找出常用軟體如記事本、瀏覽器等等,適合套用哪一種管理員? |
2. 使用標準程式庫中內建的 GUI 程式庫有什麼優缺點? |
練習 |
---|
1. 繼續單元 26 練習的鬥獸棋遊戲,將新程式寫在 exercise2901.py 中,仿照 Lion 類別,設計 Elephant 類別。 參考程式碼 |
2. 承上題,將新程式寫在 exercise2902.py 中,繼續設計 Cat 類別。 參考程式碼 |
3. 承上題,將新程式寫在 exercise2903.py 中,繼續設計 Mouse 類別。 參考程式碼 |
4. 承上題,將新程式寫在 exercise2904.py 中,繼續設計在命令列模擬四隻不同動物移動的動畫程式。 參考程式碼 |
5. 承上題,將新程式寫在 exercise2905.py 中,將模擬程式移植到 Tk 視窗中顯示。 參考程式碼 |
6. 承上題,將新程式寫在 exercise2906.py 中,回到命令列設計 get_world_string() 函數取得地圖字串,另外設計 generate_result() 函數產生遊戲結果字串。 參考程式碼 |
7. 承上題,將新程式寫在 exercise2906.py 中,將上述程式移植到 Tk 視窗,使之成為文字輪播動畫。 參考程式碼 |
8. 繼續單元 25 練習的擲骰子遊戲,將新程式寫在 exercise2908.py 中,利用 Tk 視窗顯示結果。 參考程式碼 |
9. 承上題,將新程式寫在 exercise2909.py 中,改成文字輪播動畫顯示結果。 參考程式碼 |
10. 承上題,將新程式寫在 exercise2910.py 中,改成多人遊戲的結果。 參考程式碼 |