tkinter.ttk --- Tk 風(fēng)格的控件?

源代碼: Lib/tkinter/ttk.py


The tkinter.ttk module provides access to the Tk themed widget set, introduced in Tk 8.5. It provides additional benefits including anti-aliased font rendering under X11 and window transparency (requiring a composition window manager on X11).

tkinter.ttk 的基本設(shè)計思路,就是盡可能地把控件的行為代碼與實(shí)現(xiàn)其外觀的代碼分離開來。

參見

Tk 控件風(fēng)格

介紹 Tk 風(fēng)格的文檔

ttk 的用法?

使用 ttk 之前,首先要導(dǎo)入模塊:

from tkinter import ttk

為了覆蓋基礎(chǔ)的 Tk 控件,應(yīng)該在 Tk 之后進(jìn)行導(dǎo)入:

from tkinter import *
from tkinter.ttk import *

這段代碼會讓以下幾個 tkinter. ttk 控件(Button, Checkbutton, Entry, Frame, Label, LabelFrame, Menubutton, PanedWindow, Radiobutton, ScaleScrollbar)自動替換掉 Tk 的對應(yīng)控件。

使用新控件的直接好處,是擁有更好的跨平臺的外觀,但新舊控件并不完全兼容。主要區(qū)別在于,Ttk 組件不再包含“fg”、“bg”等與樣式相關(guān)的屬性 。而是用 ttk.Style 類來定義更美觀的樣式效果。

參見

將現(xiàn)有應(yīng)用程序遷移為 Tile 控件 。

此文介紹遷移為新控件時的常見差別(使用 Tcl )。

ttk 控件?

ttk 中有 18 種部件 ,其中 12 種在 tkinter 中已包含了: Button 、 Checkbutton 、EntryFrameLabel, LabelFrame 、 MenubuttonPanedWindowRadiobutton 、 ScaleScrollbarSpinbox。另有 6 種是新增的: Combobox 、 Notebook 、 Progressbar 、 Separator 、 SizegripTreeview。這些控件全都是 Widget 的子類。

ttk 控件可以改善應(yīng)用程序的外觀。如上所述,修改樣式的代碼與 tk 控件存在差異。

Tk 代碼:

l1 = tkinter.Label(text="Test", fg="black", bg="white")
l2 = tkinter.Label(text="Test", fg="black", bg="white")

Ttk 代碼:

style = ttk.Style()
style.configure("BW.TLabel", foreground="black", background="white")

l1 = ttk.Label(text="Test", style="BW.TLabel")
l2 = ttk.Label(text="Test", style="BW.TLabel")

有關(guān) TtkStyling 的更多信息,請參閱 Style 類文檔。

控件?

ttk.Widget 定義了 Tk 風(fēng)格控件支持的標(biāo)準(zhǔn)屬性和方法,不應(yīng)直接對其進(jìn)行實(shí)例化。

標(biāo)準(zhǔn)屬性?

所有 ttk 控件均可設(shè)置以下屬性:

屬性

描述

class

指定窗口類。若要從參數(shù)庫中查找窗口的其他屬性,或確認(rèn)窗口的默認(rèn)綁定標(biāo)簽,或選擇控件的默認(rèn)布局和樣式,會用到 class 屬性。該屬性只讀,且只能在創(chuàng)建窗口時指定。

cursor

指定控件使用的鼠標(biāo)光標(biāo)。若設(shè)為空字符串(默認(rèn)值),則會繼承父控件的光標(biāo)。

takefocus

決定了窗口是否可用鍵盤獲得焦點(diǎn)。返回 0 、1 或空字符串。若返回 0,則表示在用鍵盤遍歷時應(yīng)該跳過該窗口。如果為 1,則表示只要窗口可見即應(yīng)接收輸入焦點(diǎn)。而空字符串則表示由遍歷代碼決定窗口是否接收焦點(diǎn)。

style

可用于指定自定義控件樣式。

可滾動控件的屬性?

帶滾動條的控件支持以下屬性:

屬性

描述

xscrollcommand

用于與水平滾動條通訊.

當(dāng)窗口中的可見內(nèi)容發(fā)生變化時,控件將根據(jù) scrollcommand 生成 Tcl 命令。

通常該屬性由一些滾動條的 Scrollbar.set() 方法組成。當(dāng)窗口中的可見內(nèi)容發(fā)生變化時,將會刷新滾動條的狀態(tài)。

yscrollcommand

用于與垂直滾動條通訊,更多信息請參考上一條。

標(biāo)簽控件的屬性?

標(biāo)簽、按鈕和類似按鈕的控件支持以下屬性。

屬性

描述

text

指定顯示在控件內(nèi)的文本。

textvariable

指定一個變量名,其值將用于設(shè)置 text 屬性。

underline

設(shè)置文本字符串中帶下劃線字符的索引(基于0)。下劃線字符用于激活快捷鍵。

image

指定一個用于顯示的圖片。這是一個由1個或多個元素組成的列表。第一個元素是默認(rèn)的圖片名稱。列表的其余部分是由 Style.map() 定義的“狀態(tài)/值對”的序列,指定控件在某狀態(tài)或狀態(tài)組合時要采用的圖片。列表中的所有圖片應(yīng)具備相同的尺寸。

compound

指定同時存在 text 和 image 屬性時,應(yīng)如何顯示文本和對應(yīng)的圖片。合法的值包括:

  • text::只顯示文本

  • image:只顯示圖片

  • top、bottom、left、right:分別在文本的上、下、左、右顯示圖片。

  • none:默認(rèn)值。 如果給出了圖片則顯示,否則顯示文本。

width

如果值大于零,指定文本標(biāo)簽留下多少空間,單位是字符數(shù);如果值小于零,則指定最小寬度。如果等于零或未指定,則使用文本標(biāo)簽本身的寬度。

兼容性屬性?

屬性

描述

state

可以設(shè)為“normal”或“disabled”,以便控制“禁用”狀態(tài)標(biāo)志位。本屬性只允許寫入:用以改變控件的狀態(tài),但 Widget.state() 方法不影響本屬性。

控件狀態(tài)?

控件狀態(tài)是多個相互獨(dú)立的狀態(tài)標(biāo)志位的組合。

標(biāo)志位

描述

active

鼠標(biāo)光標(biāo)經(jīng)過控件并按下鼠標(biāo)按鈕,將引發(fā)動作。

disabled

控件處于禁用狀態(tài),而由程序控制。

focus

控件接受鍵盤焦點(diǎn)。

pressed

控件已被按下。

selected

勾選或單選框之類的控件,表示啟用、選中狀態(tài)。

background

Windows 和 Mac 系統(tǒng)的窗口具有“激活”或后臺的概念。后臺窗口的控件會設(shè)置 foreground 參數(shù),而前臺窗口的控件則會清除此狀態(tài)。

readonly

控件不允許用戶修改。

alternate

控件的備選顯式格式。

invalid

控件的值是無效的

所謂的控件狀態(tài),就是一串狀態(tài)名稱的組合,可在某個名稱前加上感嘆號,表示該狀態(tài)位是關(guān)閉的。

ttk.Widget?

除了以下方法之外,ttk.Widget 還支持 tkinter.Widget.cget()tkinter.Widget.configure() 方法。

class tkinter.ttk.Widget?
identify(x, y)?

返回位于 x y 的控件名稱,如果該坐標(biāo)點(diǎn)不屬于任何控件,則返回空字符串。

xy 是控件內(nèi)的相對坐標(biāo),單位是像素。

instate(statespec, callback=None, *args, **kw)?

檢測控件的狀態(tài)。如果沒有設(shè)置回調(diào)函數(shù),那么當(dāng)控件狀態(tài)符合 statespec 時返回 True,否則返回 False。如果指定了回調(diào)函數(shù),那么當(dāng)控件狀態(tài)匹配 statespec 時將會調(diào)用回調(diào)函數(shù),且會帶上后面的參數(shù)。

state(statespec=None)?

修改或查詢控件的狀態(tài)。如果給出了 statespec,則會設(shè)置控件的狀態(tài),并返回一個新的*statespec*,表明哪些標(biāo)志做過改動。如果未給出 statespec,則返回當(dāng)前啟用的狀態(tài)標(biāo)志。

statespec 通常是個列表或元組。

Combobox?

ttk.Combobox 控件是文本框和下拉列表的組合體。該控件是 Entry 的子類。

除了從 Widget 繼承的 Widget.cget()Widget.configure() 、Widget.identify() 、Widget.instate()Widget.state() 方法,以及從 Entry 繼承的 Entry.bbox() 、 Entry.delete() 、 Entry.icursor() 、Entry.index()Entry.insert() 、 Entry.selection() 、 Entry.xview() 方法,控件還自帶了其他幾個方法,在 ttk.Combobox 中都有介紹。

屬性?

控件可設(shè)置以下屬性:

屬性

描述

exportselection

布爾值,如果設(shè)為 True,則控件的選中文字將關(guān)聯(lián)為窗口管理器的選中文字(可由 Misc.selection_get 返回)。

justify

指定文本在控件中的對齊方式。可為 left、center、right 之一。

height

設(shè)置下拉列表框的高度。

postcommand

在顯示之前將被調(diào)用的代碼(可用 Misc.register 進(jìn)行注冊)。可用于選擇要顯示的值。

state

normal 、readonly 或 disabled。在 readonly 狀態(tài)下,數(shù)據(jù)不能直接編輯,用戶只能從下拉列表中選取。在 normal 狀態(tài)下,可直接編輯文本框。在 disabled 狀態(tài)下,無法做任何交互。

textvariable

設(shè)置一個變量名,其值與控件的值關(guān)聯(lián)。每當(dāng)該變量對應(yīng)的值發(fā)生變動時,控件值就會更新,反之亦然。參見 tkinter.StringVar 。

values

設(shè)置顯示于下拉列表中的值。

width

設(shè)置為整數(shù)值,表示輸入窗口的應(yīng)有寬度,單位是字符單位(控件字體的平均字符寬度)。

虛擬事件?

當(dāng)用戶從下拉列表中選擇某個元素時,控件會生成一條 <<ComboboxSelected>> 虛擬事件。

ttk.Combobox?

class tkinter.ttk.Combobox?
current(newindex=None)?

如果給出了 newindex,則把控件值設(shè)為 newindex 位置的元素值。否則,返回當(dāng)前值的索引,當(dāng)前值未在列表中則返回 -1。

get()?

返回控件的當(dāng)前值。

set(value)?

設(shè)置控件的值為 value 。

Spinbox?

ttk.Spinbox 控件是 ttk.Entry 的擴(kuò)展,帶有遞增和遞減箭頭??捎糜跀?shù)字或字符串列表。這是 Entry 的子類。

除了從 Widget 繼承的 Widget.cget() 、 Widget.configure() 、Widget.identified()Widget.instate()Widget.state() 方法,以及從 Entry 繼承的 Entry. bbox() 、 Entry.delete() 、 Entry.icursor() 、Entry.index() 、 Entry.insert() 、 Entry.xview() 方法,控件還自帶了其他一些方法,在 ttk.Spinbox 中都有介紹。

屬性?

控件可設(shè)置以下屬性:

屬性

描述

from

浮點(diǎn)值。如若給出,則為遞減按鈕能夠到達(dá)的最小值。作為參數(shù)使用時必須寫成 from_,因?yàn)?from 是 Python 關(guān)鍵字。

to

浮點(diǎn)值。如若給出,則為遞增按鈕能夠到達(dá)的最大值。

increment

浮點(diǎn)值。指定遞增/遞減按鈕每次的修改量。默認(rèn)值為 1.0。

values

字符串或浮點(diǎn)值構(gòu)成的序列。如若給出,則遞增/遞減會在此序列元素間循環(huán),而不是增減數(shù)值。

wrap

布爾值。若為 True ,則遞增和遞減按鈕會由 to 值循環(huán)至 from 值,或由 from 值循環(huán)至 to 值。

format

字符串。指定遞增/遞減按鈕的數(shù)字格式。必須以“%W.Pf”的格式給出,W 是填充的寬度,P 是小數(shù)精度,% 和 f 就是本身的含義。

command

Python 回調(diào)函數(shù)。只要遞增或遞減按鈕按下之后,就會進(jìn)行不帶參數(shù)的調(diào)用。

虛擬事件?

用戶若按下 <Up> ,則控件會生成 <<Increment>> 虛擬事件,若按下 <Down> 則會生成 <<Decrement>> 事件。

ttk.Spinbox?

class tkinter.ttk.Spinbox?
get()?

返回控件的當(dāng)前值。

set(value)?

設(shè)置控件值為 value。

Notebook?

Ttk Notebook 控件管理著多個窗口的集合,每次顯示其中的一個。每個子窗口都與某個 tab 關(guān)聯(lián),可供用戶選中以改變當(dāng)前顯示的窗口。

屬性?

控件可設(shè)置以下屬性:

屬性

描述

height

如若給出且大于 0,則指定面板的應(yīng)有高度(不含內(nèi)部 padding 或 tab)。否則會采用所有子窗口面板的最大高度。

padding

指定在控件外部添加的留白。padding 是最多包含四個值的列表,指定左頂右底的空間。如果給出的元素少于四個,底部值默認(rèn)為頂部值,右側(cè)值默認(rèn)為左側(cè)值,頂部值默認(rèn)為左側(cè)值。

width

若給出且大于 0,則設(shè)置面板的應(yīng)有寬度(不含內(nèi)部 padding)。否則將采用所有子窗口面板的最大寬度。

Tab 屬性?

Tab 特有屬性如下:

屬性

描述

state

可為 normal、disabled 或 disabled 之一。若為 disabled 則不能選中。若為 hidden 則不會顯示。

sticky

指定子窗口在面板內(nèi)的定位方式。應(yīng)為包含零個或多個 n、s、e 、w 字符的字符串。每個字母表示子窗口應(yīng)緊靠的方向(北、南、東或西),正如 grid() 位置管理器所述。

padding

指定控件和面板之間的留白空間。格式與本控件的 padding 屬性相同。

text

指定顯示在 tab 上的文本。

image

指定顯示在 tab 上的圖片。參見 Widget 的 image 屬性。

compound

當(dāng)文本和圖片同時存在時,指定圖片相對于文本的顯示位置。合法的屬性值參見 Label Options 。

underline

指定下劃線在文本字符串中的索引(基于0)。如果調(diào)用過了 Notebook.enable_traversal(),帶下劃線的字符將用于激活快捷鍵。

Tab ID?

The tab_id present in several methods of ttk.Notebook may take any of the following forms:

  • 介于 0 和 tab 總數(shù)之間的整數(shù)值。

  • 子窗口的名稱。

  • 以“@x,y”形式給出的位置,唯一標(biāo)識了 tab 頁。

  • 字符串“current”,標(biāo)識當(dāng)前選中的 Tab。

  • 字符串字面值 "end",它返回標(biāo)簽頁的數(shù)量 (僅適用于 Notebook.index())

虛擬事件?

當(dāng)選中一個新 tab 頁之后,控件會生成一條 <<NotebookTabChanged>> 虛擬事件。

ttk.Notebook?

class tkinter.ttk.Notebook?
add(child, **kw)?

添加一個新 tab 頁。

如果窗口是由 Notebook 管理但處于隱藏狀態(tài),則會恢復(fù)到之前的位置。

可用屬性請參見 Tab Options 。

forget(tab_id)?

刪除 tab_id 指定的 tab 頁,對其關(guān)聯(lián)的窗口不再作映射和管理。

hide(tab_id)?

隱藏 tab_id 指定的 tab 頁。

tab 頁不會顯示出來,但關(guān)聯(lián)的窗口仍接受 Notebook 的管理,其配置屬性會繼續(xù)保留。隱藏的 tab 頁可由 add() 恢復(fù)。

identify(x, y)?

返回 tab 頁內(nèi)位置為 x、y 的控件名稱,若不存在則返回空字符串。

index(tab_id)?

返回 tab_id 指定 tab 頁的索引值,如果 tab_id 為 end 則返回 tab 頁的總數(shù)。

insert(pos, child, **kw)?

在指定位置插入一個 tab。

pos 可為字符串“end” 、整數(shù)索引值或子窗口名稱。如果 child 已由 Notebook 管理,則將其移至指定位置。

可用屬性請參見 Tab Options 。

select(tab_id=None)?

選中 tab_id 指定 tab。

顯示關(guān)聯(lián)的子窗口,之前選中的窗口將取消映射關(guān)系。如果省略 tab_id ,則返回當(dāng)前選中面板的控件名稱。

tab(tab_id, option=None, **kw)?

查詢或修改 tab_id 指定 tab 的屬性。

如果未給出 kw ,則返回由 tab 屬性組成的字典。如果指定了 option,則返回其值。否則,設(shè)置屬性值。

tabs()?

返回 Notebook 管理的窗口列表。

enable_traversal()?

為包含 Notebook 的頂層窗口啟用鍵盤遍歷。

這將為包含 Notebook 的頂層窗口增加如下鍵盤綁定關(guān)系:

  • Control-Tab :選中當(dāng)前 tab 之后的頁。

  • Shift-Control-Tab :選中當(dāng)前 tab 之前的頁。

  • Alt-K :這里 K 是任意 tab 頁的快捷鍵(帶下劃線)字符,將會直接選中該 tab。

一個頂層窗口中可為多個 Notebook 啟用鍵盤遍歷,包括嵌套的 Notebook 。但僅當(dāng)所有面板都將所在 Notebook 作為父控件時,鍵盤遍歷才會生效。

Progressbar?

ttk.Progressbar 控件可為長時間操作顯示狀態(tài)。可工作于兩種模式:1)determinate 模式,顯示相對完成進(jìn)度;2) indeterminate 模式,顯示動畫讓用戶知道工作正在進(jìn)行中。

屬性?

控件可設(shè)置以下屬性:

屬性

描述

orient

horizontal 或 vertical。指定進(jìn)度條的顯示方向。

length

指定進(jìn)度條長軸的長度(橫向?yàn)閷挾?,縱向則為高度)。

mode

determinate 或 indeterminate。

maximum

設(shè)定最大值。默認(rèn)為 100。

value

進(jìn)度條的當(dāng)前值。在 determinate 模式下代表已完成的工作量。在 indeterminate 模式下,解釋為 maximum 的模;也就是說,當(dāng)本值增至 maximum 時,進(jìn)度條完成了一個“周期”。

variable

與屬性值關(guān)聯(lián)的變量名。若給出,則當(dāng)變量值變化時會自動設(shè)為進(jìn)度條的值。

phase

只讀屬性。只要值大于 0 且在 determinate 模式下小于最大值,控件就會定期增大該屬性值。當(dāng)前主題可利用本屬性提供額外的動畫效果。

ttk.Progressbar?

class tkinter.ttk.Progressbar?
start(interval=None)?

開啟自增模式:安排一個循環(huán)的定時器事件,每隔 interval 毫秒調(diào)用一次 Progressbar.step()。interval 可省略,默認(rèn)為 50毫秒。

step(amount=None)?

將進(jìn)度條的值增加 amount

amount 可省略,默認(rèn)為 1.0。

stop()?

停止自增模式:取消所有由 Progressbar.start() 啟動的循環(huán)定時器事件。

Separator?

The ttk.Separator widget displays a horizontal or vertical separator bar.

除由 ttk.Widget 繼承而來的方法外,沒有定義其他方法。

屬性?

屬性如下:

屬性

描述

orient

horizontal 或 vertical。指定分隔條的方向。

Sizegrip?

ttk.Sizegrip 控件允許用戶通過按下并拖動控制柄來調(diào)整內(nèi)部頂層窗口的大小。

除由 ttk.Widget 繼承的之外,沒有其他屬性和方法。

與平臺相關(guān)的注意事項?

  • On macOS, toplevel windows automatically include a built-in size grip by default. Adding a Sizegrip is harmless, since the built-in grip will just mask the widget.

Bug?

  • 假如內(nèi)部的頂層窗口位置是相對于屏幕的右側(cè)或底部進(jìn)行設(shè)置的,那么 Sizegrip 控件將不會改變窗口的大小。

  • Sizegrip 僅支持往“東南”方向的縮放。

Treeview?

ttk.Treeview 控件可將多項內(nèi)容分層級顯示。每個數(shù)據(jù)項抖帶有一個文本標(biāo)簽、一張圖片(可選)和一個數(shù)據(jù)列表(可選)。這些數(shù)據(jù)值將在樹標(biāo)簽后面分列顯示。

數(shù)據(jù)值的顯示順序可用屬性 displaycolumns 進(jìn)行控制。樹控件還可以顯示列標(biāo)題。數(shù)據(jù)列可通過數(shù)字或名稱進(jìn)行訪問,各列的名稱在屬性 columns 中列出。參閱 Column Identifiers。

每個數(shù)據(jù)項都由唯一名稱進(jìn)行標(biāo)識。如果調(diào)用者未提供數(shù)據(jù)項的 ID,樹控件會自動生成。根有且只有一個,名為 {}。根本身不會顯示出來;其子項將顯示在頂層。

每個數(shù)據(jù)項均帶有一個 tag 列表,可用于綁定事件及控制外觀。

Treeview 組件支持水平和垂直滾動,滾動時會依據(jù) Scrollable Widget Options 描述的屬性和 Treeview.xview()Treeview.yview() 方法。

屬性?

控件可設(shè)置以下屬性:

屬性

描述

columns

列標(biāo)識的列表,定義了列的數(shù)量和名稱。

displaycolumns

列標(biāo)識的列表(索引可為符號或整數(shù)),指定要顯示的數(shù)據(jù)列及顯示順序,或?yàn)樽址?“#all”。

height

指定可見的行數(shù)。注意:所需寬度由各列寬度之和決定。

padding

指定控件內(nèi)部的留白。為不超過四個元素的長度列表。

selectmode

控制內(nèi)部類如何進(jìn)行選中項的管理??蔀?extended、browse 或 none。若設(shè)為 extended(默認(rèn)),則可選中多個項。若為 browse ,則每次只能選中一項。若為 none,則無法修改選中項。

請注意,代碼和 tag 綁定可自由進(jìn)行選中操作,不受本屬性的限制。

show

由0個或下列值組成的列表,指定要顯示樹的哪些元素。

  • tree :在 #0 列顯示樹的文本標(biāo)簽。

  • headings :顯示標(biāo)題行。

默認(rèn)為“tree headings”,顯示所有元素。

** 注意** :第 #0 列一定是指 tree 列,即便未設(shè)置 show="tree" 也一樣。

數(shù)據(jù)項的屬性?

可在插入和數(shù)據(jù)項操作時設(shè)置以下屬性。

屬性

描述

text

用于顯示的文本標(biāo)簽。

image

Tk 圖片對象,顯示在文本標(biāo)簽左側(cè)。

values

關(guān)聯(lián)的數(shù)據(jù)值列表。

每個數(shù)據(jù)項關(guān)聯(lián)的數(shù)據(jù)數(shù)量應(yīng)與 columns 屬性相同。如果比 columns 屬性的少,剩下的值將視為空。如果多于 columns 屬性的,多余數(shù)據(jù)將被忽略。

open

TrueFalse,表明是否顯示數(shù)據(jù)項的子樹。

tags

與該數(shù)據(jù)項關(guān)聯(lián)的 tag 列表。

tag 屬性?

tag 可定義以下屬性:

屬性

描述

foreground

定義文本前景色。

background

定義單元格或數(shù)據(jù)項的背景色。

font

定義文本的字體。

image

定義數(shù)據(jù)項的圖片,當(dāng) image 屬性為空時使用。

列標(biāo)識?

列標(biāo)識可用以下格式給出:

  • 由 columns 屬性給出的符號名。

  • 整數(shù)值 n,指定第 n 列。

  • #n 的字符串格式,n 是整數(shù),指定第 n 個顯示列。

注意:

  • 數(shù)據(jù)項屬性的顯示順序可能與存儲順序不一樣。

  • #0 列一定是指 tree 列,即便未指定 show="tree" 也是一樣。

數(shù)據(jù)列號是指屬性值列表中的索引值,顯示列號是指顯示在樹控件中的列號。樹的文本標(biāo)簽將顯示在 #0 列。如果未設(shè)置 displaycolumns 屬性,則數(shù)據(jù)列 n 將顯示在第 #n+1 列。再次強(qiáng)調(diào)一下,#0 列一定是指 tree 列 。

虛擬事件?

Treeview 控件會生成以下虛擬事件。

事件

描述

<<TreeviewSelect>>

當(dāng)選中項發(fā)生變化時生成。

<<TreeviewOpen>>

當(dāng)焦點(diǎn)所在項的 open= True 之前立即生成。

<<TreeviewClose>>

當(dāng)焦點(diǎn)所在項的 open= True 之后立即生成。

Treeview.focus()Treeview.selection() 方法可用于確認(rèn)涉及的數(shù)據(jù)項。

ttk.Treeview?

class tkinter.ttk.Treeview?
bbox(item, column=None)?

返回某 數(shù)據(jù)項 的邊界(相對于控件窗口的坐標(biāo)),形式為 (x, y, width, height) 。

若給出了 column,則返回該單元格的邊界。若該 數(shù)據(jù)項 不可見(即從屬于已關(guān)閉項或滾動至屏幕外),則返回空字符串。

get_children(item=None)?

返回 item 的下屬數(shù)據(jù)項列表。

若未給出 item ,則返回根的下屬數(shù)據(jù)。

set_children(item, *newchildren)?

newchildren 替換 item 的下屬數(shù)據(jù)。

對于 item 中存在而 newchildren 中不存在的數(shù)據(jù)項,會從樹中移除。newchildren 中的數(shù)據(jù)不能是 item 的上級。注意,未給出 newchildren 會導(dǎo)致 item 的子項被解除關(guān)聯(lián)。

column(column, option=None, **kw)?

查詢或修改列 column 的屬性。

如果未給出 kw,則返回屬性值的字典。若指定了 option,則會返回該屬性值。否則將設(shè)置屬性值。

合法的 屬性/值 可為:

  • id

    返回列名。這是只讀屬性。

  • anchor:標(biāo)準(zhǔn)的 Tk 錨點(diǎn)值。

    指定該列的文本在單元格內(nèi)的對齊方式。

  • minwidth:寬度。

    列的最小寬度,單位是像素。在縮放控件或用戶拖動某一列時,Treeview 會保證列寬不小于此值。

  • stretch: True/False

    指明縮放控件時是否調(diào)整列寬。

  • width:寬度

    列寬,單位為像素數(shù)。

若要設(shè)置 tree 列,請帶上參數(shù) column = "#0" 進(jìn)行調(diào)用。

delete(*items)?

刪除所有 items 及其下屬。

根不能刪除。

detach(*items)?

將所有 items 與樹解除關(guān)聯(lián)。

數(shù)據(jù)項及其下屬依然存在,后續(xù)可以重新插入,目前只是不顯示出來。

根不能解除關(guān)聯(lián)。

exists(item)?

如果給出的 item 位于樹中,則返回 True。

focus(item=None)?

如果給出 item 則設(shè)為當(dāng)前焦點(diǎn)。否則返回當(dāng)前焦點(diǎn)所在數(shù)據(jù)項,若無則返回 ''。

heading(column, option=None, **kw)?

查詢或修改某 column 的標(biāo)題。

若未給出 kw,則返回列標(biāo)題組成的列表。若給出了 option 則返回對應(yīng)屬性值。否則,設(shè)置屬性值。

合法的 屬性/值 可為:

  • text:文本。

    顯示為列標(biāo)題的文本。

  • image:圖片名稱

    指定顯示在列標(biāo)題右側(cè)的圖片。

  • anchor:錨點(diǎn)

    指定列標(biāo)題文本的對齊方式。應(yīng)為標(biāo)準(zhǔn)的 Tk 錨點(diǎn)值。

  • command:回調(diào)函數(shù)

    點(diǎn)擊列標(biāo)題時執(zhí)行的回調(diào)函數(shù)。

若要對 tree 列進(jìn)行設(shè)置,請帶上 column = "#0" 進(jìn)行調(diào)用。

identify(component, x, y)?

返回 xy 位置上 component 數(shù)據(jù)項的描述信息,如果此處沒有該數(shù)據(jù)項,則返回空字符串。

identify_row(y)?

返回 y 位置上的數(shù)據(jù)項 ID。

identify_column(x)?

返回 x 位置上的單元格所在的數(shù)據(jù)列 ID。

tree 列的 ID 為 #0 。

identify_region(x, y)?

返回以下值之一:

區(qū)域

含義

heading

樹的標(biāo)題欄區(qū)域。

separator

兩個列標(biāo)題之間的間隔區(qū)域。

tree

樹區(qū)域。

cell

數(shù)據(jù)單元格。

可用性:Tk 8.6。

identify_element(x, y)?

返回位于 x 、y 的數(shù)據(jù)項。

可用性:Tk 8.6。

index(item)?

返回 item 在父項的子項列表中的整數(shù)索引。

insert(parent, index, iid=None, **kw)?

新建一個數(shù)據(jù)項并返回其 ID。

parent 是父項的 ID,若要新建頂級項則為空字符串。 index 是整數(shù)或“end”,指明在父項的子項列表中的插入位置。如果 index 小于等于0,則在開頭插入新節(jié)點(diǎn);如果 index 大于或等于當(dāng)前子節(jié)點(diǎn)數(shù),則將其插入末尾。如果給出了 iid,則將其用作數(shù)據(jù)項 ID; iid 不得存在于樹中。否則會新生成一個唯一 ID。

此處可設(shè)置的屬性請參閱 Item Options

item(item, option=None, **kw)?

查詢或修改某 item 的屬性。

如果未給出 option,則返回屬性/值構(gòu)成的字典。如果給出了 option,則返回該屬性的值。否則,將屬性設(shè)為 kw 給出的值。

move(item, parent, index)?

item 移至指定位置,父項為 parent ,子項列表索引為 index 。

將數(shù)據(jù)項移入其子項之下是非法的。如果 index 小于等于0,item 將被移到開頭;如果大于等于子項的總數(shù),則被移至最后。如果 item 已解除關(guān)聯(lián),則會被重新關(guān)聯(lián)。

next(item)?

返回 item 的下一個相鄰項,如果 item 是父項的最后一個子項,則返回 ''。

parent(item)?

返回 item 的父項 ID,如果 item 為頂級節(jié)點(diǎn),則返回 ''。

prev(item)?

返回 item 的前一個相鄰項,若 item 為父項的第一個子項,則返回 ''。

reattach(item, parent, index)?

Treeview.move() 的別名。

see(item)?

確保 item 可見。

item 所有上級的 open 屬性設(shè)為 True,必要時會滾動控件,讓 item 處于樹的可見部分。

selection()?

返回由選中項構(gòu)成的元組。

在 3.8 版更改: selection() 不再接受參數(shù)了。若要改變選中的狀態(tài),請使用下面介紹的方法。

selection_set(*items)?

items 成為新的選中項。

在 3.6 版更改: items 可作為多個單獨(dú)的參數(shù)傳遞,而不只是作為一個元組。

selection_add(*items)?

items 加入選中項。

在 3.6 版更改: items 可作為多個單獨(dú)的參數(shù)傳遞,而不只是作為一個元組。

selection_remove(*items)?

從選中項中移除 items 。

在 3.6 版更改: items 可作為多個單獨(dú)的參數(shù)傳遞,而不只是作為一個元組。

selection_toggle(*items)?

切換 items 中各項的選中狀態(tài)。

在 3.6 版更改: items 可作為多個單獨(dú)的參數(shù)傳遞,而不只是作為一個元組。

set(item, column=None, value=None)?

若帶一個參數(shù),則返回 item 的列/值字典。若帶兩個參數(shù),則返回 column 的當(dāng)前值。若帶三個參數(shù),則將 itemcolumn 設(shè)為 value。

tag_bind(tagname, sequence=None, callback=None)?

為 tag 為 tagname 的數(shù)據(jù)項綁定事件 sequence 的回調(diào)函數(shù)。當(dāng)事件分發(fā)給該數(shù)據(jù)項時,tag 參數(shù)為 tagname 的全部數(shù)據(jù)項的回調(diào)都會被調(diào)用到。

tag_configure(tagname, option=None, **kw)?

查詢或修改 tagname 指定項的屬性。

如果給出了 kw,則返回 tagname 項的屬性字典。如果給出了 option,則返回 tagname 項的 option 屬性值。否則,設(shè)置 tagname 項的屬性值。

tag_has(tagname, item=None)?

如果給出了 item ,則依據(jù) item 是否具備 tagname 而返回 1 或 0。否則,返回 tag 為 tagname 的所有數(shù)據(jù)項構(gòu)成的列表。

可用性:Tk 8.6。

xview(*args)?

查詢或修改 Treeview 的橫向位置。

yview(*args)?

查詢或修改 Treeview 的縱向位置。

Ttk 樣式?

ttk 的每種控件都賦有一個樣式,指定了控件內(nèi)的元素及其排列方式,以及元素屬性的動態(tài)和默認(rèn)設(shè)置。默認(rèn)情況下,樣式名與控件的類名相同,但可能會被控件的 style 屬性覆蓋。如果不知道控件的類名,可用 Misc.winfo_class() 方法獲?。╯omewidget.winfo_class())。

參見

Tcl'2004 會議報告

文章解釋了主題引擎的工作原理。

class tkinter.ttk.Style?

用于操控樣式數(shù)據(jù)庫的類。

configure(style, query_opt=None, **kw)?

查詢或設(shè)置 style 的默認(rèn)屬性值。

Each key in kw is an option and each value is a string identifying the value for that option.

例如,要將默認(rèn)按鈕改為扁平樣式,并帶有留白和各種背景色:

from tkinter import ttk
import tkinter

root = tkinter.Tk()

ttk.Style().configure("TButton", padding=6, relief="flat",
   background="#ccc")

btn = ttk.Button(text="Sample")
btn.pack()

root.mainloop()
map(style, query_opt=None, **kw)?

查詢或設(shè)置 style 的指定屬性的動態(tài)值。

kw 的每個鍵都是一個屬性,每個值通常應(yīng)為列表或元組,其中包含以元組、列表或其他形式組合而成的狀態(tài)標(biāo)識(statespec)。狀態(tài)標(biāo)識是由一個或多個狀態(tài)組合,加上一個值組成。

舉個例子能更清晰些:

import tkinter
from tkinter import ttk

root = tkinter.Tk()

style = ttk.Style()
style.map("C.TButton",
    foreground=[('pressed', 'red'), ('active', 'blue')],
    background=[('pressed', '!disabled', 'black'), ('active', 'white')]
    )

colored_btn = ttk.Button(text="Test", style="C.TButton").pack()

root.mainloop()

請注意,要點(diǎn)是屬性的(狀態(tài),值)序列的順序,如果前景色屬性的順序改為 [('active', 'blue'), ('pressed', 'red')] ,則控件處于激活或按下狀態(tài)時的前景色將為藍(lán)色。

lookup(style, option, state=None, default=None)?

返回 style 中的 option 屬性值。

如果給出了 state ,則應(yīng)是一個或多個狀態(tài)組成的序列。如果設(shè)置了 default 參數(shù),則在屬性值缺失時會用作后備值。

若要檢測按鈕的默認(rèn)字體,可以:

from tkinter import ttk

print(ttk.Style().lookup("TButton", "font"))
layout(style, layoutspec=None)?

按照 style 定義控件布局。如果省略了 layoutspec,則返回該樣式的布局屬性。

若給出了 layoutspec,則應(yīng)為一個列表或其他的序列類型(不包括字符串),其中的數(shù)據(jù)項應(yīng)為元組類型,第一項是布局名稱,第二項的格式應(yīng)符合 Layouts 的描述。

以下示例有助于理解這種格式(這里并沒有實(shí)際意義):

from tkinter import ttk
import tkinter

root = tkinter.Tk()

style = ttk.Style()
style.layout("TMenubutton", [
   ("Menubutton.background", None),
   ("Menubutton.button", {"children":
       [("Menubutton.focus", {"children":
           [("Menubutton.padding", {"children":
               [("Menubutton.label", {"side": "left", "expand": 1})]
           })]
       })]
   }),
])

mbtn = ttk.Menubutton(text='Text')
mbtn.pack()
root.mainloop()
element_create(elementname, etype, *args, **kw)?

在當(dāng)前主題中創(chuàng)建一個新元素 etype ,應(yīng)為 image、from 或 vsapi。后者僅在 Windows XP 和 Vista 版的 Tk 8.6a 中可用,此處不再贅述。

如果用了 image,則 args 應(yīng)包含默認(rèn)的圖片名,后面跟著 狀態(tài)標(biāo)識/值(這里是 imagespec),kw 可帶有以下屬性:

  • border=padding

    padding 是由不超過四個整數(shù)構(gòu)成的列表,分別定義了左、頂、右、底的邊界。

  • height=height

    定義了元素的最小高度。如果小于零,則默認(rèn)采用圖片本身的高度。

  • padding=padding

    定義了元素的內(nèi)部留白。若未指定則默認(rèn)采用 border 值。

  • sticky=spec

    定義了圖片的對齊方式。spec 包含零個或多個 n、s、w、e 字符。

  • width=width

    定義了元素的最小寬度。如果小于零,則默認(rèn)采用圖片本身的寬度。

如果 etype 的值用了 from,則 element_create() 將復(fù)制一個現(xiàn)有的元素。 args 應(yīng)包含主題名和可選的要復(fù)制的元素。若未給出要克隆的元素,則采用空元素。 kw 參數(shù)將被丟棄。

element_names()?

返回當(dāng)前主題已定義的元素列表 。

element_options(elementname)?

返回 elementname 元素的屬性列表。

theme_create(themename, parent=None, settings=None)?

新建一個主題。

如果 themename 已經(jīng)存在,則會報錯。如果給出了 parent,則新主題將從父主題繼承樣式、元素和布局。若給出了 settings ,則語法應(yīng)與 theme_settings() 的相同。

theme_settings(themename, settings)?

將當(dāng)前主題臨時設(shè)為 themename,并應(yīng)用 settings,然后恢復(fù)之前的主題。

settings 中的每個鍵都是一種樣式而每個值可能包含 'configure', 'map', 'layout' 和 'element create' 等鍵并且它們被預(yù)期具有與分別由 Style.configure(), Style.map(), Style.layout()Style.element_create() 方法所指定的相符的格式。

以下例子會對 Combobox 的默認(rèn)主題稍作修改:

from tkinter import ttk
import tkinter

root = tkinter.Tk()

style = ttk.Style()
style.theme_settings("default", {
   "TCombobox": {
       "configure": {"padding": 5},
       "map": {
           "background": [("active", "green2"),
                          ("!disabled", "green4")],
           "fieldbackground": [("!disabled", "green3")],
           "foreground": [("focus", "OliveDrab1"),
                          ("!disabled", "OliveDrab2")]
       }
   }
})

combo = ttk.Combobox().pack()

root.mainloop()
theme_names()?

返回所有已知主題的列表。

theme_use(themename=None)?

若未給出 themename,則返回正在使用的主題。否則,將當(dāng)前主題設(shè)為 themename,刷新所有控件并引發(fā) <<ThemeChanged>> 事件。

布局?

布局在沒有屬性時可以為 None ,或是定義了元素排列方式的屬性字典。布局機(jī)制采用了位置管理器的簡化版本:給定一個初始容器(cavity),為每個元素都分配一個包裝盒(parcel)。合法的選項/值包括:

  • side: whichside

    指定元素置于容器的哪一側(cè); 頂、右、底或左。如果省略,則該元素將占據(jù)整個容器。

  • sticky: nswe

    指定元素在已分配包裝盒內(nèi)的放置位置。

  • unit: 0 或 1

    如果設(shè)為 1,則將元素及其所有后代均視作單個元素以供 Widget.identify() 等使用。 它被用于滾動條之類帶有控制柄的東西。

  • children: [sublayout... ]

    指定要放置于元素內(nèi)的元素列表。每個元素都是一個元組(或其他序列類型),其中第一項是布局名稱,另一項是個 Layout 。