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è)計(jì)思路,就是盡可能地把控件的行為代碼與實(shí)現(xiàn)其外觀的代碼分離開(kāi)來(lái)。

參見(jià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 *

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

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

參見(jiàn)

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

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

ttk 控件?

ttk 中有 18 種部件 ,其中 12 種在 tkinter 中已包含了: Button 、 Checkbutton 、Entry 、 FrameLabel, LabelFrame 、 Menubutton 、PanedWindow 、Radiobutton 、 Scale 、 ScrollbarSpinbox。另有 6 種是新增的: Combobox 、 Notebook 、 ProgressbarSeparator 、 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 的更多信息,請(qǐng)參閱 Style 類文檔。

控件?

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

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

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

屬性

描述

class

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

cursor

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

takefocus

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

style

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

可滾動(dòng)控件的屬性?

帶滾動(dòng)條的控件支持以下屬性:

屬性

描述

xscrollcommand

用于與水平滾動(dòng)條通訊.

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

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

yscrollcommand

用于與垂直滾動(dòng)條通訊,更多信息請(qǐng)參考上一條。

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

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

屬性

描述

text

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

textvariable

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

underline

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

image

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

compound

指定同時(shí)存在 text 和 image 屬性時(shí),應(yīng)如何顯示文本和對(duì)應(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)是多個(gè)相互獨(dú)立的狀態(tài)標(biāo)志位的組合。

標(biāo)志位

描述

active

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

disabled

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

focus

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

pressed

控件已被按下。

selected

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

background

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

readonly

控件不允許用戶修改。

alternate

控件的備選顯式格式。

invalid

控件的值是無(wú)效的

所謂的控件狀態(tài),就是一串狀態(tài)名稱的組合,可在某個(gè)名稱前加上感嘆號(hào),表示該狀態(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)的相對(duì)坐標(biāo),單位是像素。

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

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

state(statespec=None)?

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

statespec 通常是個(gè)列表或元組。

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() 方法,控件還自帶了其他幾個(gè)方法,在 ttk.Combobox 中都有介紹。

屬性?

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

屬性

描述

exportselection

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

justify

指定文本在控件中的對(duì)齊方式??蔀?left、center、right 之一。

height

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

postcommand

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

state

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

textvariable

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

values

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

width

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

虛擬事件?

當(dāng)用戶從下拉列表中選擇某個(gè)元素時(shí),控件會(huì)生成一條 <<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ù)使用時(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ì)在此序列元素間循環(huán),而不是增減數(shù)值。

wrap

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

format

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

command

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

虛擬事件?

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

ttk.Spinbox?

class tkinter.ttk.Spinbox?
get()?

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

set(value)?

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

Notebook?

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

屬性?

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

屬性

描述

height

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

padding

指定在控件外部添加的留白。padding 是最多包含四個(gè)值的列表,指定左頂右底的空間。如果給出的元素少于四個(gè),底部值默認(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 則不會(huì)顯示。

sticky

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

padding

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

text

指定顯示在 tab 上的文本。

image

指定顯示在 tab 上的圖片。參見(jiàn) Widget 的 image 屬性。

compound

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

underline

指定下劃線在文本字符串中的索引(基于0)。如果調(diào)用過(guò)了 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)識(shí)了 tab 頁(yè)。

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

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

虛擬事件?

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

ttk.Notebook?

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

添加一個(gè)新 tab 頁(yè)。

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

可用屬性請(qǐng)參見(jiàn) Tab Options 。

forget(tab_id)?

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

hide(tab_id)?

隱藏 tab_id 指定的 tab 頁(yè)。

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

identify(x, y)?

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

index(tab_id)?

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

insert(pos, child, **kw)?

在指定位置插入一個(gè) tab。

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

可用屬性請(qǐng)參見(jiàn) 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 之后的頁(yè)。

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

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

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

Progressbar?

ttk.Progressbar 控件可為長(zhǎng)時(shí)間操作顯示狀態(tài)??晒ぷ饔趦煞N模式:1)determinate 模式,顯示相對(duì)完成進(jìn)度;2) indeterminate 模式,顯示動(dòng)畫讓用戶知道工作正在進(jìn)行中。

屬性?

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

屬性

描述

orient

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

length

指定進(jìn)度條長(zhǎng)軸的長(zhǎng)度(橫向?yàn)閷挾龋v向則為高度)。

mode

determinate 或 indeterminate。

maximum

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

value

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

variable

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

phase

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

ttk.Progressbar?

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

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

step(amount=None)?

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

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

stop()?

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

Separator?

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

除由 ttk.Widget 繼承而來(lái)的方法外,沒(méi)有定義其他方法。

屬性?

屬性如下:

屬性

描述

orient

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

Sizegrip?

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

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

與平臺(tái)相關(guān)的注意事項(xiàng)?

  • 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)部的頂層窗口位置是相對(duì)于屏幕的右側(cè)或底部進(jìn)行設(shè)置的,那么 Sizegrip 控件將不會(huì)改變窗口的大小。

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

Treeview?

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

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

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

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

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

屬性?

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

屬性

描述

columns

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

displaycolumns

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

height

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

padding

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

selectmode

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

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

show

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

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

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

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

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

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

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

屬性

描述

text

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

image

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

values

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

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

open

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

tags

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

tag 屬性?

tag 可定義以下屬性:

屬性

描述

foreground

定義文本前景色。

background

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

font

定義文本的字體。

image

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

列標(biāo)識(shí)?

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

  • 由 columns 屬性給出的符號(hào)名。

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

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

注意:

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

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

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

虛擬事件?

Treeview 控件會(huì)生成以下虛擬事件。

事件

描述

<<TreeviewSelect>>

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

<<TreeviewOpen>>

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

<<TreeviewClose>>

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

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

ttk.Treeview?

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

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

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

get_children(item=None)?

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

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

set_children(item, *newchildren)?

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

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

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

查詢或修改列 column 的屬性。

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

合法的 屬性/值 可為:

  • id

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

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

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

  • minwidth:寬度。

    列的最小寬度,單位是像素。在縮放控件或用戶拖動(dòng)某一列時(shí),Treeview 會(huì)保證列寬不小于此值。

  • stretch: True/False

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

  • width:寬度

    列寬,單位為像素?cái)?shù)。

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

delete(*items)?

刪除所有 items 及其下屬。

根不能刪除。

detach(*items)?

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

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

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

exists(item)?

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

focus(item=None)?

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

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

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

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

合法的 屬性/值 可為:

  • text:文本。

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

  • image:圖片名稱

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

  • anchor:錨點(diǎn)

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

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

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

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

identify(component, x, y)?

返回 x、y 位置上 component 數(shù)據(jù)項(xiàng)的描述信息,如果此處沒(méi)有該數(shù)據(jù)項(xiàng),則返回空字符串。

identify_row(y)?

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

identify_column(x)?

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

tree 列的 ID 為 #0 。

identify_region(x, y)?

返回以下值之一:

區(qū)域

含義

heading

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

separator

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

tree

樹區(qū)域。

cell

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

可用性:Tk 8.6。

identify_element(x, y)?

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

可用性:Tk 8.6。

index(item)?

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

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

新建一個(gè)數(shù)據(jù)項(xiàng)并返回其 ID。

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

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

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

查詢或修改某 item 的屬性。

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

move(item, parent, index)?

item 移至指定位置,父項(xiàng)為 parent ,子項(xiàng)列表索引為 index

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

next(item)?

返回 item 的下一個(gè)相鄰項(xiàng),如果 item 是父項(xiàng)的最后一個(gè)子項(xiàng),則返回 ''。

parent(item)?

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

prev(item)?

返回 item 的前一個(gè)相鄰項(xiàng),若 item 為父項(xiàng)的第一個(gè)子項(xiàng),則返回 ''。

reattach(item, parent, index)?

Treeview.move() 的別名。

see(item)?

確保 item 可見(jiàn)。

item 所有上級(jí)的 open 屬性設(shè)為 True,必要時(shí)會(huì)滾動(dòng)控件,讓 item 處于樹的可見(jiàn)部分。

selection()?

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

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

selection_set(*items)?

items 成為新的選中項(xiàng)。

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

selection_add(*items)?

items 加入選中項(xiàng)。

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

selection_remove(*items)?

從選中項(xiàng)中移除 items 。

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

selection_toggle(*items)?

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

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

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

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

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

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

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

查詢或修改 tagname 指定項(xiàng)的屬性。

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

tag_has(tagname, item=None)?

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

可用性:Tk 8.6。

xview(*args)?

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

yview(*args)?

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

Ttk 樣式?

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

參見(jiàn)

Tcl'2004 會(huì)議報(bào)告

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

class tkinter.ttk.Style?

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

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 的指定屬性的動(dòng)態(tài)值。

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

舉個(gè)例子能更清晰些:

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()

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

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

返回 style 中的 option 屬性值。

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

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

from tkinter import ttk

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

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

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

以下示例有助于理解這種格式(這里并沒(méi)有實(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)建一個(gè)新元素 etype ,應(yīng)為 image、from 或 vsapi。后者僅在 Windows XP 和 Vista 版的 Tk 8.6a 中可用,此處不再贅述。

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

  • border=padding

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

  • height=height

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

  • padding=padding

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

  • sticky=spec

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

  • width=width

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

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

element_names()?

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

element_options(elementname)?

返回 elementname 元素的屬性列表。

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

新建一個(gè)主題。

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

theme_settings(themename, settings)?

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

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

以下例子會(huì)對(duì) 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>> 事件。

布局?

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

  • side: whichside

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

  • sticky: nswe

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

  • unit: 0 或 1

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

  • children: [sublayout... ]

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