本教程是博主個人心血,未經允許不可引用,引用必舉報,舉報必封號。
博主個人博客【魏大王官網】,內容更精彩!!
《tkinter實用教程一》Linux 環境下安裝tkinter
《tkinter實用教程三》tkinter Button 控件
《tkinter實用教程四》tkinter 布局管理 Grid
《tkinter實用教程五》tkinter ttk.Frame控件
tkinter 的子模塊 ttk
本文主要介紹 tkinter
子模塊的特性,以及和原生 tkinter
控件之間的區別。
tkinter.ttk
模塊提供了對 tk
風格控件集合的訪問途徑,在 tkinter 8.5
中引入。
引入 tkinter.ttk
的基本思想是盡可能將實現控件行為的代碼與實現其外觀的代碼分開。
如果用一句話解釋引入 ttk
的目的,那就是:
使用 ttk
控件可以改善應用程序的外觀和感覺。
ttk
模塊是 tkinter
的新特性,因此,建議使用 ttk
控件作為開發和學習的重點。
如何創建 ttk 控件
創建 ttk
控件的方法和 tkinter
控件的方法略有不同:
創建一個 tkinter
按鈕:
from tkinter import *
root = Tk()
btn = Button(root,text="tkinter 按鈕")
btn.pack()
root.mainloop()
創建一個 ttk
按鈕:
from tkinter import *
from tkinter import ttk
root = Tk()
btn = ttk.Button(root,text="ttk 按鈕")
btn.pack()
root.mainloop()
以下是兩段代碼的執行結果:
從截圖可以明顯看出 tkinter
原生按鈕的樣式和 ttk
模塊按鈕的默認樣式是不一樣的。
如何設置 ttk 控件的樣式
ttk
子模塊的引出,主要目的是解決界面美觀度和分離控制代碼和樣式代碼的目的。
所以 ttk
在樣式控制上和 tkinter
有較大區別。
下面以 Label
對象為例,通過創建一個藍底紅字的標簽,說明二者的主要區別:
使用 tkinter
控件的代碼:
from tkinter import *
root = Tk()
l1 = Label(text="label1",fg="red",bg="blue")
l1.pack()
root.mainloop()
使用 ttk
控件的代碼:
from tkinter import *
from tkinter import ttk
root = Tk()
style_default = ttk.Style()
style_default.configure("TLabel",foreground="red",background="blue")
l1 = ttk.Label(root,text="lable1",style='TLabel')
l1.pack()
root.mainloop()
以下是代碼執行的結果:
二者在展示效果上基本沒有區別,主要區別在代碼的編寫上。
由於 ttk
分離了控件的創建代碼和樣式代碼,所以代碼看起來比較復雜,行數較多。
實際上,ttk
由於抽離了樣式代碼,同樣的樣式只需要寫一次,在創建控件的時候可以直接引用,所以當控件較多時,會極大的降低工作和代碼量。
而 tkinter
原生控件每次創建一個控件,都需要寫一遍樣式代碼,所以不適合使用在稍微復雜一點的應用中。
configure() 函數的參數
ttk.Style()
對象實例能夠通過 ttk.Style().configure()
函數設置樣式各選項的值。
ttk.Style().configure()
函數的第一個參數是樣式的名稱,ttk
中所有的控件都默認分配了一個樣式名稱,例如 Button
組件的默認樣式名稱是 "TButton"。
Label
控件的默認樣式名稱是 "TLabel"。
所以上述 ttk
樣式代碼還可以寫成如下模式:
from tkinter import *
from tkinter import ttk
root = Tk()
style_default = ttk.Style()
style_default.configure("TLabel",foreground="red",background="blue")
l1 = ttk.Label(root,text="lable1")
l1.pack()
root.mainloop()
雖然,在創建 Label
對象 l1
時,並沒有指定樣式名稱,但是 style_default
同樣會影響到 l1
的樣式,因為 "TLabel" 樣式是 Label
對象默認的樣式。
代碼執行結果如下圖:
ttk 支持的控件
ttk
帶有17個控件,其中11個已經存在於 tkinter
中:Button
,Checkbutton
,Entry
,Frame
,Label
,LabelFrame
,Menubutton
,PanedWindow
,Radiobutton
,Scale
和 Scrollbar
。
6個新的窗口控件類是:Combobox
,Notebook
,Progressbar
,Separator
,Sizegrip
和 Treeview
。 所有這些類都是Widget的子類。
ttk 控件通用參數
ttk.Widget
類定義了 tk
風格控件的標准可選參數和通用方法,該類類似於 Java
中的接口,不應該直接實例化。
- 所有
ttk
控件都能接受以下參數:
參數 | 描述 |
---|---|
class | 指定窗口類。 該類用於在選項數據庫中查詢窗口的其他選項、確定窗口的默認綁定標簽以及選擇控件的默認布局和樣式。 此選項是只讀的,只能在創建窗口時指定。 |
cursor | 指定要用於控件的鼠標光標。 如果設置為空字符串(默認值),從父控件繼承光標。 |
takefocus | 確定窗口在鍵盤遍歷期間是否接受焦點。 返回 0、1 或空字符串。 如果返回 0,則表示在鍵盤遍歷期間應完全跳過該窗口。 如果為 1,則表示只要窗口可見,就應該接收輸入焦點。 空字符串意味着遍歷腳本決定是否關注窗口。 |
style | 可用於指定控件樣式。 |
- 可滾動控件的通用可選參數
具備滾動條的控件支持以下可選參數:
參數 | 描述 |
---|---|
xscrollcommand | 用於與水平滾動條通信。當widget窗口中的視圖發生變化時,widget會根據scrollcommand生成Tcl命令。通常這個選項由一些滾動條的Scrollbar.set()方法組成。 這將導致滾動條在窗口中的視圖發生變化時更新。 |
yscrollcommand | 用於與垂直滾動條通信。 有關更多信息,請參見上文。 |
- 標簽類控件的通用參數
Label
、Button
和類Button
控件支持以下可選參數:
參數 | 描述 |
---|---|
text | 指定在控件中展示的字符串 |
textvariable | 指定一個變量名,這個變量的值會填充text參數,展示在控件中。 |
underline | 如果設置,則指定要在文本字符串中加下划線的字符的索引(從 0 開始)。 下划線字符用於助記符激活。 |
image | 指定要顯示的圖像。 這是一個包含 1 個或多個元素的列表。 第一個元素是默認圖像名稱。 列表的其余部分是由 Style.map() 定義的一系列 statespec/value 對,指定當小部件處於特定狀態或狀態組合時要使用的不同圖像。 列表中的所有圖像都應具有相同的大小。 |
compound | 在文本和圖像選項都存在的情況下,指定如何相對於文本顯示圖像。 有效值為:text:僅顯示文本;image:僅顯示圖像;top、bottom、left、right:分別顯示文本的上方、下方、左側或右側的圖像。none:默認值。 顯示圖像(如果存在),否則顯示文本。 |
width | 如果大於零,則指定為文本標簽分配多少字符寬度的空間,如果小於零,則指定最小寬度。 如果為零或未指定,則使用文本標簽的自然寬度。 |
- 兼容性選項
參數 | 描述 |
---|---|
state | 可設置為 normal 或 disabled 以控制“禁用”狀態位。 這是一個只寫選項:設置它會更改控件狀態,但 Widget.state() 方法不影響此選項。 |
- 控件狀態
控件狀態由獨立的狀態標志組成的位圖:
參數 | 描述 |
---|---|
active | 鼠標光標在小部件上,按下鼠標按鈕會導致一些動作發生。 |
disabled | 在程序控制下,控件被禁用 |
focus | 焦點 |
pressed | 控件被按下 |
selected | On 、true 或 current 用於諸如 Checkbuttons 和 radiobuttons 之類的東西 |
background | Windows和Mac有一個“active”或前景窗口的概念。背景狀態在后台窗口中為控件設置,並在前台窗口中清除。 |
readonly | 只讀,不允許用戶改動 |
alternate | 特定於窗口控件件的替代顯示格式。 |
invalid | 控件的值無效。 |
博主個人博客【魏大王官網】,內容更精彩!!
《tkinter實用教程一》Linux 環境下安裝tkinter
《tkinter實用教程三》tkinter Button 控件