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í)現其外觀(guān)的代碼分離開(kāi)來(lái)。

參見(jiàn)

Tk 控件風(fēng)格

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

ttk 的用法?

使用 ttk 之前,首先要導入模塊:

from tkinter import ttk

為了覆蓋基礎的 Tk 控件,應該在 Tk 之后進(jìn)行導入:

from tkinter import *
from tkinter.ttk import *

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

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

參見(jiàn)

將現有應用程序遷移為 Tile 控件 。

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

ttk 控件?

ttk 中有 18 種部件 ,其中 12 種在 tkinter 中已包含了: Button 、 Checkbutton 、Entry 、 Frame 、 Label, LabelFrame 、 Menubutton 、PanedWindow 、Radiobutton 、 Scale 、 ScrollbarSpinbox。另有 6 種是新增的: Combobox 、 Notebook 、 Progressbar 、 Separator 、 SizegripTreeview。這些控件全都是 Widget 的子類(lèi)。

ttk 控件可以改善應用程序的外觀(guān)。如上所述,修改樣式的代碼與 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 類(lèi)文檔。

控件?

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

標準屬性?

所有 ttk 控件均可設置以下屬性:

屬性

描述

class

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

cursor

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

takefocus

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

style

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

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

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

屬性

描述

xscrollcommand

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

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

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

yscrollcommand

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

標簽控件的屬性?

標簽、按鈕和類(lèi)似按鈕的控件支持以下屬性。

屬性

描述

text

指定顯示在控件內的文本。

textvariable

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

underline

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

image

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

compound

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

  • text::只顯示文本

  • image:只顯示圖片

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

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

width

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

兼容性屬性?

屬性

描述

state

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

控件狀態(tài)?

控件狀態(tài)是多個(gè)相互獨立的狀態(tài)標志位的組合。

標志位

描述

active

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

disabled

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

focus

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

pressed

控件已被按下。

selected

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

background

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

readonly

控件不允許用戶(hù)修改。

alternate

控件的備選顯式格式。

invalid

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

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

ttk.Widget?

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

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

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

xy 是控件內的相對坐標,單位是像素。

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

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

state(statespec=None)?

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

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

Combobox?

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

除了從 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 中都有介紹。

屬性?

控件可設置以下屬性:

屬性

描述

exportselection

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

justify

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

height

設置下拉列表框的高度。

postcommand

在顯示之前將被調用的代碼(可用 Misc.register 進(jìn)行注冊)??捎糜谶x擇要顯示的值。

state

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

textvariable

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

values

設置顯示于下拉列表中的值。

width

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

虛擬事件?

當用戶(hù)從下拉列表中選擇某個(gè)元素時(shí),控件會(huì )生成一條 <<ComboboxSelected>> 虛擬事件。

ttk.Combobox?

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

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

get()?

返回控件的當前值。

set(value)?

設置控件的值為 value 。

Spinbox?

ttk.Spinbox 控件是 ttk.Entry 的擴展,帶有遞增和遞減箭頭??捎糜跀底只蜃址斜?。這是 Entry 的子類(lèi)。

除了從 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 中都有介紹。

屬性?

控件可設置以下屬性:

屬性

描述

from

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

to

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

increment

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

values

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

wrap

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

format

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

command

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

虛擬事件?

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

ttk.Spinbox?

class tkinter.ttk.Spinbox?
get()?

返回控件的當前值。

set(value)?

設置控件值為 value。

Notebook?

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

屬性?

控件可設置以下屬性:

屬性

描述

height

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

padding

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

width

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

Tab 屬性?

Tab 特有屬性如下:

屬性

描述

state

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

sticky

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

padding

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

text

指定顯示在 tab 上的文本。

image

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

compound

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

underline

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

Tab ID?

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

  • 介于 0 和 tab 總數之間的整數值。

  • 子窗口的名稱(chēng)。

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

  • 字符串“current”,標識當前選中的 Tab。

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

虛擬事件?

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

ttk.Notebook?

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

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

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

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

forget(tab_id)?

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

hide(tab_id)?

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

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

identify(x, y)?

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

index(tab_id)?

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

insert(pos, child, **kw)?

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

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

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

select(tab_id=None)?

選中 tab_id 指定 tab。

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

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

查詢(xún)或修改 tab_id 指定 tab 的屬性。

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

tabs()?

返回 Notebook 管理的窗口列表。

enable_traversal()?

為包含 Notebook 的頂層窗口啟用鍵盤(pán)遍歷。

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

  • Control-Tab :選中當前 tab 之后的頁(yè)。

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

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

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

Progressbar?

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

屬性?

控件可設置以下屬性:

屬性

描述

orient

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

length

指定進(jìn)度條長(cháng)軸的長(cháng)度(橫向為寬度,縱向則為高度)。

mode

determinate 或 indeterminate。

maximum

設定最大值。默認為 100。

value

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

variable

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

phase

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

ttk.Progressbar?

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

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

step(amount=None)?

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

amount 可省略,默認為 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 控件允許用戶(hù)通過(guò)按下并拖動(dòng)控制柄來(lái)調整內部頂層窗口的大小。

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

與平臺相關(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?

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

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

Treeview?

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

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

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

每個(gè)數據項均帶有一個(gè) tag 列表,可用于綁定事件及控制外觀(guān)。

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

屬性?

控件可設置以下屬性:

屬性

描述

columns

列標識的列表,定義了列的數量和名稱(chēng)。

displaycolumns

列標識的列表(索引可為符號或整數),指定要顯示的數據列及顯示順序,或為字符串 “#all”。

height

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

padding

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

selectmode

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

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

show

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

  • tree :在 #0 列顯示樹(shù)的文本標簽。

  • headings :顯示標題行。

默認為“tree headings”,顯示所有元素。

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

數據項的屬性?

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

屬性

描述

text

用于顯示的文本標簽。

image

Tk 圖片對象,顯示在文本標簽左側。

values

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

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

open

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

tags

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

tag 屬性?

tag 可定義以下屬性:

屬性

描述

foreground

定義文本前景色。

background

定義單元格或數據項的背景色。

font

定義文本的字體。

image

定義數據項的圖片,當 image 屬性為空時(shí)使用。

列標識?

列標識可用以下格式給出:

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

  • 整數值 n,指定第 n 列。

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

注意:

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

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

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

虛擬事件?

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

事件

描述

<<TreeviewSelect>>

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

<<TreeviewOpen>>

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

<<TreeviewClose>>

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

Treeview.focus()Treeview.selection() 方法可用于確認涉及的數據項。

ttk.Treeview?

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

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

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

get_children(item=None)?

返回 item 的下屬數據項列表。

若未給出 item ,則返回根的下屬數據。

set_children(item, *newchildren)?

newchildren 替換 item 的下屬數據。

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

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

查詢(xún)或修改列 column 的屬性。

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

合法的 屬性/值 可為:

  • id

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

  • anchor:標準的 Tk 錨點(diǎn)值。

    指定該列的文本在單元格內的對齊方式。

  • minwidth:寬度。

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

  • stretch: True/False

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

  • width:寬度

    列寬,單位為像素數。

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

delete(*items)?

刪除所有 items 及其下屬。

根不能刪除。

detach(*items)?

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

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

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

exists(item)?

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

focus(item=None)?

如果給出 item 則設為當前焦點(diǎn)。否則返回當前焦點(diǎn)所在數據項,若無(wú)則返回 ''。

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

查詢(xún)或修改某 column 的標題。

若未給出 kw,則返回列標題組成的列表。若給出了 option 則返回對應屬性值。否則,設置屬性值。

合法的 屬性/值 可為:

  • text:文本。

    顯示為列標題的文本。

  • image:圖片名稱(chēng)

    指定顯示在列標題右側的圖片。

  • anchor:錨點(diǎn)

    指定列標題文本的對齊方式。應為標準的 Tk 錨點(diǎn)值。

  • command:回調函數

    點(diǎn)擊列標題時(shí)執行的回調函數。

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

identify(component, x, y)?

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

identify_row(y)?

返回 y 位置上的數據項 ID。

identify_column(x)?

返回 x 位置上的單元格所在的數據列 ID。

tree 列的 ID 為 #0 。

identify_region(x, y)?

返回以下值之一:

區域

含義

heading

樹(shù)的標題欄區域。

separator

兩個(gè)列標題之間的間隔區域。

tree

樹(shù)區域。

cell

數據單元格。

可用性:Tk 8.6。

identify_element(x, y)?

返回位于 x 、y 的數據項。

可用性:Tk 8.6。

index(item)?

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

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

新建一個(gè)數據項并返回其 ID。

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

此處可設置的屬性請參閱 Item Options 。

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

查詢(xún)或修改某 item 的屬性。

如果未給出 option,則返回屬性/值構成的字典。如果給出了 option,則返回該屬性的值。否則,將屬性設為 kw 給出的值。

move(item, parent, index)?

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

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

next(item)?

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

parent(item)?

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

prev(item)?

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

reattach(item, parent, index)?

Treeview.move() 的別名。

see(item)?

確保 item 可見(jiàn)。

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

selection()?

返回由選中項構成的元組。

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

selection_set(*items)?

items 成為新的選中項。

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

selection_add(*items)?

items 加入選中項。

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

selection_remove(*items)?

從選中項中移除 items 。

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

selection_toggle(*items)?

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

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

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

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

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

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

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

查詢(xún)或修改 tagname 指定項的屬性。

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

tag_has(tagname, item=None)?

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

可用性:Tk 8.6。

xview(*args)?

查詢(xún)或修改 Treeview 的橫向位置。

yview(*args)?

查詢(xún)或修改 Treeview 的縱向位置。

Ttk 樣式?

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

參見(jiàn)

Tcl'2004 會(huì )議報告

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

class tkinter.ttk.Style?

用于操控樣式數據庫的類(lèi)。

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

查詢(xún)或設置 style 的默認屬性值。

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

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

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

查詢(xún)或設置 style 的指定屬性的動(dòng)態(tài)值。

kw 的每個(gè)鍵都是一個(gè)屬性,每個(gè)值通常應為列表或元組,其中包含以元組、列表或其他形式組合而成的狀態(tài)標識(statespec)。狀態(tài)標識是由一個(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()

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

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

返回 style 中的 option 屬性值。

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

若要檢測按鈕的默認字體,可以:

from tkinter import ttk

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

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

若給出了 layoutspec,則應為一個(gè)列表或其他的序列類(lèi)型(不包括字符串),其中的數據項應為元組類(lèi)型,第一項是布局名稱(chē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)?

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

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

  • border=padding

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

  • height=height

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

  • padding=padding

    定義了元素的內部留白。若未指定則默認采用 border 值。

  • sticky=spec

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

  • width=width

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

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

element_names()?

返回當前主題已定義的元素列表 。

element_options(elementname)?

返回 elementname 元素的屬性列表。

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

新建一個(gè)主題。

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

theme_settings(themename, settings)?

將當前主題臨時(shí)設為 themename,并應用 settings,然后恢復之前的主題。

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

以下例子會(huì )對 Combobox 的默認主題稍作修改:

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,則返回正在使用的主題。否則,將當前主題設為 themename,刷新所有控件并引發(fā) <<ThemeChanged>> 事件。

布局?

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

  • side: whichside

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

  • sticky: nswe

    指定元素在已分配包裝盒內的放置位置。

  • unit: 0 或 1

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

  • children: [sublayout... ]

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