為什麼需要 ttk
前面章節使用的Label、Button、Entry、Radiobutton、Checkbutton都是tkinter模組內建的「傳統元件」,這些元件的外觀(按鈕樣式、方塊邊框…)是tkinter自己繪製的,在不同作業系統上長相都一樣,也因此看起來會比較陽春、不像該作業系統原生的視窗程式。
Python另外提供了tkinter.ttk模組,內含一組「主題化元件(Themed widget)」,外觀會依作業系統目前的佈景主題自動繪製(例如在Windows上會呈現Windows原生控制項的樣式),視覺上更貼近該平台使用者習慣的應用程式,因此新開發的視窗程式通常建議優先使用ttk元件。匯入方式如下:
from tkinter import ttk如上寫法會把ttk模組匯入並保留ttk名稱,之後即可用ttk.元件名稱(...)的方式建立主題化元件,例如ttk.Button(...)、ttk.Entry(...)。
tk 與 ttk 元件對照
ttk模組針對大多數常用元件都提供了對應版本,用法(建立語法、常用參數)與tk版本大致相同,下表列出常見元件的對照,以及ttk額外提供、tk沒有的元件:
| tk(傳統元件) | ttk(主題化元件) | 說明 |
|---|---|---|
tkinter.Label | ttk.Label | 標籤,用法相同,可參考〈2. Label 標籤元件〉。 |
tkinter.Button | ttk.Button | 按鈕,用法相同,可參考〈4. Button 按鈕元件〉。 |
tkinter.Entry | ttk.Entry | 文字方塊,用法相同,可參考〈5. Entry 文字方塊元件〉。 |
tkinter.Radiobutton | ttk.Radiobutton | 選項按鈕,用法相同,可參考〈7. Radiobutton 選項按鈕元件〉。 |
tkinter.Checkbutton | ttk.Checkbutton | 核取按鈕,用法相同,可參考〈8. Checkbutton 核取按鈕元件〉。 |
tkinter.Frame | ttk.Frame | 一般容器,用來將元件分組、輔助版面配置,可參考〈12. Frame 與 LabelFrame 容器元件〉。 |
| (無對應) | ttk.LabelFrame | 帶標題外框的容器,可參考〈12. Frame 與 LabelFrame 容器元件〉。 |
| (無對應) | ttk.Combobox | 下拉式選單,可參考〈13. Combobox 下拉式選單元件〉。 |
| (無對應) | ttk.Treeview | 表格/清單元件,可一次顯示多欄多列資料,可參考〈14. Treeview 清單(表格)元件〉。 |
ttk 元件與 tk 元件的差異
雖然多數ttk元件的建立語法、常用參數(如text、width、textvariable、command、state)都與tk版本相同,但仍有幾點差異需要留意:
| 項目 | 說明 |
|---|---|
| 外觀顏色 | ttk元件的外觀由目前的「佈景主題(theme)」統一控制,因此不支援background/bg、foreground/fg這類直接改色的參數;若要客製化外觀需另外設定ttk.Style,本教學不深入說明。 |
state 參數 | ttk元件的狀態一樣可用'normal'、'disabled'、'readonly'等字串設定,概念與Entry的state參數相同,可參考〈5. Entry 文字方塊元件〉。 |
| 版面配置 | pack()、grid()等版面配置方法在tk與ttk元件上用法完全相同,可參考〈3. 視窗版面配置〉。 |
實際應用範例
student_crud.py這支學生資料維護程式中,畫面上的按鈕、輸入欄位、下拉選單、容器與清單,就是全部改用ttk元件建立的範例:
from tkinter import ttk, messagebox
...
ttk.Label(row0, text='姓名:', width=8).pack(side='left')
ttk.Entry(row0, textvariable=self.var_name, width=20).pack(side='left', padx=5)
ttk.Button(frame, text='新增', command=self.create).pack(side='left', padx=3)可以看到寫法與tk.Label、tk.Entry、tk.Button幾乎一樣,只是把tk換成ttk,外觀就會變成該作業系統原生的樣式。詳細可參考student_crud.py。
相關主題與延伸閱讀
- 0. 章節索引:本章全部筆記的學習地圖與快速查找。
- 1. tkinter 套件:
tkinter套件的整體介紹與元件總覽,是本篇ttk元件對照的基礎。 - 12. Frame 與 LabelFrame 容器元件:
ttk模組獨有的LabelFrame容器元件詳細介紹。 - 13. Combobox 下拉式選單元件:
ttk模組獨有、tk沒有對應版本的下拉式選單元件。 - 14. Treeview 清單(表格)元件:
ttk模組獨有、tk沒有對應版本的表格清單元件。 - 3. 視窗版面配置:
pack()、grid()排版方法在tk與ttk元件上用法完全相同。