為什麼需要 ttk

前面章節使用的LabelButtonEntryRadiobuttonCheckbutton都是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.Labelttk.Label標籤,用法相同,可參考〈2. Label 標籤元件〉。
tkinter.Buttonttk.Button按鈕,用法相同,可參考〈4. Button 按鈕元件〉。
tkinter.Entryttk.Entry文字方塊,用法相同,可參考〈5. Entry 文字方塊元件〉。
tkinter.Radiobuttonttk.Radiobutton選項按鈕,用法相同,可參考〈7. Radiobutton 選項按鈕元件〉。
tkinter.Checkbuttonttk.Checkbutton核取按鈕,用法相同,可參考〈8. Checkbutton 核取按鈕元件〉。
tkinter.Framettk.Frame一般容器,用來將元件分組、輔助版面配置,可參考〈12. Frame 與 LabelFrame 容器元件〉。
(無對應)ttk.LabelFrame帶標題外框的容器,可參考〈12. Frame 與 LabelFrame 容器元件〉。
(無對應)ttk.Combobox下拉式選單,可參考〈13. Combobox 下拉式選單元件〉。
(無對應)ttk.Treeview表格/清單元件,可一次顯示多欄多列資料,可參考〈14. Treeview 清單(表格)元件〉。

ttk 元件與 tk 元件的差異

雖然多數ttk元件的建立語法、常用參數(如textwidthtextvariablecommandstate)都與tk版本相同,但仍有幾點差異需要留意:

項目說明
外觀顏色ttk元件的外觀由目前的「佈景主題(theme)」統一控制,因此不支援background/bgforeground/fg這類直接改色的參數;若要客製化外觀需另外設定ttk.Style,本教學不深入說明。
state 參數ttk元件的狀態一樣可用'normal''disabled''readonly'等字串設定,概念與Entrystate參數相同,可參考〈5. Entry 文字方塊元件〉。
版面配置pack()grid()等版面配置方法在tkttk元件上用法完全相同,可參考〈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.Labeltk.Entrytk.Button幾乎一樣,只是把tk換成ttk,外觀就會變成該作業系統原生的樣式。詳細可參考student_crud.py


相關主題與延伸閱讀