新聞中心
tkinter.ttk —- Tk 風(fēng)格的控件
源代碼: Lib/tkinter/ttk.py

創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的高郵網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
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, Scale 和 Scrollbar)自動(dòng)替換掉 Tk 的對(duì)應(yīng)控件。
使用新控件的直接好處,是擁有更好的跨平臺(tái)的外觀,但新舊控件并不完全兼容。主要區(qū)別在于,Ttk 組件不再包含“fg”、“bg”等與樣式相關(guān)的屬性 。而是用 ttk.Style 類來(lái)定義更美觀的樣式效果。
參見(jiàn)
Converting existing applications to use Tile widgets
此文介紹遷移為新控件時(shí)的常見(jiàn)差別(使用 Tcl )。
ttk 控件
ttk 中有 18 種部件 ,其中 12 種在 tkinter 中已包含了: Button 、 Checkbutton 、Entry 、 Frame 、 Label, LabelFrame 、 Menubutton 、PanedWindow 、Radiobutton 、 Scale 、 Scrollbar 和 Spinbox。另有 6 種是新增的: Combobox 、 Notebook 、 Progressbar 、 Separator 、 Sizegrip 和 Treeview。這些控件全都是 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
決定了窗口是否可用鍵盤(pán)獲得焦點(diǎn)。返回 0 、1 或空字符串。若返回 0,則表示在用鍵盤(pán)遍歷時(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)志位。本屬性只允許寫(xiě)入:用以改變控件的狀態(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
控件接受鍵盤(pán)焦點(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)不屬于任何控件,則返回空字符串。
x 和 y 是控件內(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)
Modify or inquire widget state. If statespec is specified, sets the widget state according to it and return a new statespec indicating which flags were changed. If statespec is not specified, returns the currently enabled state flags.
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ì)生成一條 <
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í)必須寫(xiě)成 |
to |
浮點(diǎn)值。如若給出,則為遞增按鈕能夠到達(dá)的最大值。 |
increment |
浮點(diǎn)值。指定遞增/遞減按鈕每次的修改量。默認(rèn)值為 1.0。 |
values |
字符串或浮點(diǎn)值構(gòu)成的序列。如若給出,則遞增/遞減會(huì)在此序列元素間循環(huán),而不是增減數(shù)值。 |
wrap |
布爾值。若為 |
format |
字符串。指定遞增/遞減按鈕的數(shù)字格式。必須以“%W.Pf”的格式給出,W 是填充的寬度,P 是小數(shù)精度,% 和 f 就是本身的含義。 |
command |
Python 回調(diào)函數(shù)。只要遞增或遞減按鈕按下之后,就會(huì)進(jìn)行不帶參數(shù)的調(diào)用。 |
虛擬事件
用戶若按下
ttk.Spinbox
class tkinter.ttk.Spinbox
-
get()
返回控件的當(dāng)前值。
-
set(value)
設(shè)置控件值為 value。
Notebook
Ttk Notebook widget manages a collection of windows and displays a single one at a time. Each child window is associated with a tab, which the user may select to change the currently displayed window.
屬性
控件可設(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è)。
-
The literal string “current”, which identifies the currently selected tab
-
字符串字面值 “end”,它返回標(biāo)簽頁(yè)的數(shù)量 (僅適用于 Notebook.index())
虛擬事件
當(dāng)選中一個(gè)新 tab 頁(yè)之后,控件會(huì)生成一條 <
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。
The associated child window will be displayed, and the previously selected window (if different) is unmapped. If tab_id is omitted, returns the widget name of the currently selected pane.
-
tab(tab_id, option=None, \*kw*)
查詢或修改 tab_id 指定 tab 的屬性。
如果未給出 kw ,則返回由 tab 屬性組成的字典。如果指定了 option,則返回其值。否則,設(shè)置屬性值。
-
tabs()
返回 Notebook 管理的窗口列表。
-
enable_traversal()
為包含 Notebook 的頂層窗口啟用鍵盤(pán)遍歷。
這將為包含 Notebook 的頂層窗口增加如下鍵盤(pán)綁定關(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 啟用鍵盤(pán)遍歷,包括嵌套的 Notebook 。但僅當(dāng)所有面板都將所在 Notebook 作為父控件時(shí),鍵盤(pán)遍歷才會(huì)生效。
-
Progressbar
ttk.Progressbar 控件可為長(zhǎng)時(shí)間操作顯示狀態(tài)。可工作于兩種模式:1)determinate 模式,顯示相對(duì)完成進(jìn)度;2) indeterminate 模式,顯示動(dòng)畫(huà)讓用戶知道工作正在進(jìn)行中。
屬性
控件可設(shè)置以下屬性:
屬性
描述
orient
horizontal 或 vertical。指定進(jìn)度條的顯示方向。
length
指定進(jìn)度條長(zhǎng)軸的長(zhǎng)度(橫向?yàn)閷挾?,縱向則為高度)。
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)畫(huà)效果。
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
ttk.Separator 控件用于顯示橫向或縱向的分隔條。
除由 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)
- 在 macOS 上,頂層窗口默認(rèn)自動(dòng)包括了一個(gè)內(nèi)置的大小控制柄。 再加一個(gè)
Sizegrip也沒(méi)什么壞處,因?yàn)閮?nèi)置的控制柄會(huì)蓋住該控件。
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ù)值將在樹(shù)標(biāo)簽后面分列顯示。
數(shù)據(jù)值的顯示順序可用屬性 displaycolumns 進(jìn)行控制。樹(shù)控件還可以顯示列標(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,樹(shù)控件會(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è)或下列值組成的列表,指定要顯示樹(shù)的哪些元素。
tree :在 #0 列顯示樹(shù)的文本標(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
True或False,表明是否顯示數(shù)據(jù)項(xiàng)的子樹(shù)。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)是指顯示在樹(shù)控件中的列號(hào)。樹(shù)的文本標(biāo)簽將顯示在 #0 列。如果未設(shè)置 displaycolumns 屬性,則數(shù)據(jù)列 n 將顯示在第 #n+1 列。再次強(qiáng)調(diào)一下,#0 列一定是指 tree 列 。
虛擬事件
Treeview 控件會(huì)生成以下虛擬事件。
事件
描述
<
> 當(dāng)選中項(xiàng)發(fā)生變化時(shí)生成。
<
> 當(dāng)焦點(diǎn)所在項(xiàng)的 open= True 之前立即生成。
<
> 當(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ì)從樹(shù)中移除。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 與樹(shù)解除關(guān)聯(lián)。
數(shù)據(jù)項(xiàng)及其下屬依然存在,后續(xù)可以重新插入,目前只是不顯示出來(lái)。
根不能解除關(guān)聯(lián)。
-
exists(item)
如果給出的 item 位于樹(shù)中,則返回
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
樹(shù)的標(biāo)題欄區(qū)域。
separator
兩個(gè)列標(biāo)題之間的間隔區(qū)域。
tree
樹(shù)區(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 不得存在于樹(shù)中。否則會(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 處于樹(shù)的可見(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ù),則將 item 的 column 設(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() 方法獲?。╯omewidget.winfo_class())。
參見(jiàn)
Tcl’2004 conference presentation
文章解釋了主題引擎的工作原理。
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 ttkimport tkinterroot = 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 tkinterfrom tkinter import ttkroot = 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 ttkprint(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 ttkimport tkinterroot = 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 ttkimport tkinterroot = 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ā) <
> 事件。
布局
布局在沒(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 。
分享文章:創(chuàng)新互聯(lián)Python教程:tkinter.ttk—-Tk風(fēng)格的控件
URL地址:http://fisionsoft.com.cn/article/dpdsigc.html


咨詢
建站咨詢
