tkinter.ttk — Tk 主题化小部件

源代码: Lib/tkinter/ttk.py


tkinter.ttk 模块提供了对 Tk 主题化小部件集的访问,该小部件集在 Tk 8.5 中引入。它提供了额外的优势,包括在 X11 下的抗锯齿字体渲染和窗口透明度(在 X11 上需要合成窗口管理器)。

tkinter.ttk 的基本思想是尽可能地将实现小部件行为的代码与其外观实现代码分离。

参见

Tk 小部件样式支持

一篇介绍 Tk 主题支持的文档

使用 Ttk

要开始使用 Ttk,请导入其模块

from tkinter import ttk

要覆盖基本的 Tk 小部件,导入应该在 Tk 导入之后

from tkinter import *
from tkinter.ttk import *

该代码导致一些 tkinter.ttk 小部件 (Button, Checkbutton, Entry, Frame, Label, LabelFrame, Menubutton, PanedWindow, Radiobutton, ScaleScrollbar) 自动替换 Tk 小部件。

这直接受益于使用新小部件,可在不同平台提供更好的外观和感觉;然而,替换的小部件并非完全兼容。主要区别在于,小部件选项(如“fg”、“bg”以及其他与小部件样式相关的选项)在 Ttk 小部件中不再存在。相反,请使用 ttk.Style 类以获得改进的样式效果。

参见

将现有应用程序转换为使用 Tile 小部件

一篇关于将应用程序迁移到新小部件时通常遇到的差异的专著(使用 Tcl 术语)。

Ttk 小部件

Ttk 提供了 18 个小部件,其中 12 个已经存在于 tkinter 中:Button, Checkbutton, Entry, Frame, Label, LabelFrame, Menubutton, PanedWindow, Radiobutton, Scale, Scrollbar, 和 Spinbox。其他六个是新的:Combobox, Notebook, Progressbar, Separator, SizegripTreeview。所有这些都是 Widget 的子类。

使用 Ttk 小部件可以改善应用程序的外观和感觉。如上所述,样式编码方式存在差异。

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

有关 TtkStyling 的更多信息,请参阅 Style 类文档。

小部件

ttk.Widget 定义了 Tk 主题化小部件支持的标准选项和方法,不应直接实例化。

标准选项

所有 ttk 小部件都接受以下选项

选项

描述

指定窗口类。在查询选项数据库以获取窗口的其他选项时,用于确定窗口的默认绑定标签,并选择小部件的默认布局和样式。此选项是只读的,只能在创建窗口时指定。

cursor

指定小部件要使用的鼠标光标。如果设置为空字符串(默认值),则光标将从父小部件继承。

takefocus

确定窗口是否在键盘遍历期间接受焦点。返回 0、1 或空字符串。如果返回 0,表示窗口应在键盘遍历期间完全跳过。如果返回 1,表示窗口只要可见就应接收输入焦点。空字符串表示遍历脚本决定是否将焦点放在窗口上。

风格

可用于指定自定义小部件样式。

可滚动小部件选项

由滚动条控制的小部件支持以下选项。

选项

描述

xscrollcommand

用于与水平滚动条通信。

当小部件窗口中的视图改变时,小部件将根据 scrollcommand 生成一个 Tcl 命令。

通常,此选项由某些滚动条的 Scrollbar.set() 方法组成。这将导致滚动条在窗口视图更改时进行更新。

yscrollcommand

用于与垂直滚动条通信。更多信息请参见上文。

标签选项

标签、按钮和其他类似按钮的小部件支持以下选项。

选项

描述

text

指定要在小部件内部显示的文本字符串。

textvariable

指定一个名称,其值将代替 text 选项资源使用。

underline

如果设置,指定文本字符串中要下划线的字符索引(0-based)。下划线字符用于助记激活。

image

指定要显示的图像。这是一个包含 1 个或多个元素的列表。第一个元素是默认图像名称。列表的其余部分是状态规范/值对的序列,由 Style.map() 定义,指定当小部件处于特定状态或状态组合时要使用的不同图像。列表中所有图像的大小应相同。

复合

如果同时存在 text 和 images 选项,则指定图像相对于文本的显示方式。有效值为

  • text: 仅显示文本

  • image: 仅显示图像

  • top, bottom, left, right: 分别在文本上方、下方、左侧或右侧显示图像。

  • none: 默认值。如果存在图像则显示图像,否则显示文本。

width

如果大于零,指定为文本标签分配的字符宽度空间;如果小于零,指定最小宽度。如果为零或未指定,则使用文本标签的自然宽度。

兼容性选项

选项

描述

state

可以设置为“normal”或“disabled”以控制“disabled”状态位。这是一个只写选项:设置它会改变小部件状态,但 Widget.state() 方法不影响此选项。

小部件状态

小部件状态是一个由独立状态标志组成的位图。

Flag

描述

active

鼠标光标悬停在小部件上,按下鼠标按钮将触发某些操作

disabled

小部件在程序控制下禁用

focus

小部件具有键盘焦点

pressed

小部件正在被按下

selected

对于 Checkbuttons 和 radiobuttons 等,表示“开”、“真”或“当前”

background

Windows 和 Mac 有“活动”或前台窗口的概念。背景状态设置为背景窗口中的小部件,并为前台窗口中的小部件清除

readonly

小部件不应允许用户修改

alternate

小部件特定的备用显示格式

invalid

小部件的值无效

状态规范是状态名称的序列,可以选择以感叹号作为前缀,表示该位为关闭状态。

ttk.Widget

除了下面描述的方法外,ttk.Widget 还支持 tkinter.Widget.cget()tkinter.Widget.configure() 方法。

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

返回位于位置 x y 的元素的名称,如果该点不位于任何元素内,则返回空字符串。

xy 是相对于小部件的像素坐标。

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

测试小部件的状态。如果未指定回调函数,则如果小部件状态与 statespec 匹配,则返回 True,否则返回 False。如果指定了回调函数,则在小部件状态与 statespec 匹配时,将使用 args 调用它。

state(statespec=None)

修改或查询小部件状态。如果指定 statespec,则根据它设置小部件状态并返回一个新的 statespec,指示哪些标志已更改。如果未指定 statespec,则返回当前启用的状态标志。

statespec 通常是一个列表或元组。

组合框

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 中描述。

选项

此小部件接受以下特定选项

选项

描述

exportselection

布尔值。如果设置,小部件选择将链接到窗口管理器选择(例如,可以通过调用 Misc.selection_get 返回)。

justify

指定文本在小部件内的对齐方式。“left”、“center”或“right”之一。

height

指定弹出列表框的高度,以行数表示。

postcommand

一个脚本(可能已使用 Misc.register 注册),在显示值之前立即调用。它可以指定要显示的值。

state

“normal”、“readonly”或“disabled”之一。在“readonly”状态下,值不能直接编辑,用户只能从下拉列表中选择值。在“normal”状态下,文本字段可以直接编辑。在“disabled”状态下,无法进行任何交互。

textvariable

指定一个名称,其值链接到小部件值。每当与该名称关联的值改变时,小部件值都会更新,反之亦然。参见 tkinter.StringVar

指定要在下拉列表框中显示的值列表。

width

指定一个整数值,表示输入窗口的期望宽度,以小部件字体平均大小字符为单位。

虚拟事件

当用户从值列表中选择一个元素时,组合框小部件会生成一个 <<ComboboxSelected>> 虚拟事件。

ttk.Combobox

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

如果指定 newindex,则将组合框值设置为元素位置 newindex。否则,返回当前值的索引,如果当前值不在值列表中,则返回 -1。

get()

返回组合框的当前值。

set(value)

将组合框的值设置为 value

旋转框

ttk.Spinbox 小部件是一个通过增量和减量箭头增强的 ttk.Entry。它可以用于数字或字符串值列表。此小部件是 Entry 的子类。

除了继承自 Widget 的方法:Widget.cget(), Widget.configure(), Widget.identify(), Widget.instate()Widget.state(),以及继承自 Entry 的以下方法:Entry.bbox(), Entry.delete(), Entry.icursor(), Entry.index(), Entry.insert(), Entry.xview(),它还有一些其他方法,在 ttk.Spinbox 中描述。

选项

此小部件接受以下特定选项

选项

描述

from

浮点值。如果设置,这是递减按钮将递减到的最小值。当用作参数时,必须拼写为 from_,因为 from 是 Python 关键字。

to

浮点值。如果设置,这是递增按钮将递增到的最大值。

increment

浮点值。指定增量/减量按钮改变值的数量。默认为 1.0。

字符串或浮点值序列。如果指定,增量/减量按钮将在此序列中的项之间循环,而不是递增或递减数字。

wrap

布尔值。如果为 True,则增量和减量按钮将分别从 to 值循环到 from 值,或从 from 值循环到 to 值。

format

字符串值。这指定了增量/减量按钮设置的数字格式。它必须是“%W.Pf”的形式,其中 W 是值的填充宽度,P 是精度,“%”和“f”是字面量。

command

Python 可调用对象。每当增量或减量按钮被按下时,将无参数调用它。

虚拟事件

当用户按下 <Up> 时,旋转框小部件会生成一个 <<Increment>> 虚拟事件;当用户按下 <Down> 时,会生成一个 <<Decrement>> 虚拟事件。

ttk.Spinbox

class tkinter.ttk.Spinbox
get()

返回旋转框的当前值。

set(value)

将旋转框的值设置为 value

笔记本

Ttk Notebook 小部件管理一组窗口,并一次显示一个。每个子窗口都与一个选项卡关联,用户可以选择该选项卡来更改当前显示的窗口。

选项

此小部件接受以下特定选项

选项

描述

height

如果存在且大于零,指定窗格区域的期望高度(不包括内部填充或选项卡)。否则,使用所有窗格的最大高度。

padding

指定在笔记本外部添加的额外空间量。填充是一个最多四个长度规格的列表:左、上、右、下。如果指定的元素少于四个,则底部默认为上,右默认为左,上默认为左。

width

如果存在且大于零,指定窗格区域的期望宽度(不包括内部填充)。否则,使用所有窗格的最大宽度。

选项卡选项

选项卡也有特定的选项

选项

描述

state

“normal”、“disabled”或“hidden”之一。如果为“disabled”,则选项卡不可选。如果为“hidden”,则选项卡不显示。

sticky

指定子窗口在窗格区域内的定位方式。值是一个包含零个或多个字符“n”、“s”、“e”或“w”的字符串。每个字母表示子窗口将粘附的一侧(北、南、东或西),如 grid() 几何管理器所示。

padding

指定在笔记本和此窗格之间添加的额外空间量。语法与此小部件使用的 padding 选项相同。

text

指定要在选项卡中显示的文本。

image

指定要在选项卡中显示的图像。参见 Widget 中描述的 image 选项。

复合

在 text 和 image 选项都存在的情况下,指定图像相对于文本的显示方式。有关合法值,请参见 标签选项

underline

指定文本字符串中要下划线的字符索引(0-based)。如果调用了 Notebook.enable_traversal(),下划线字符将用于助记激活。

选项卡标识符

ttk.Notebook 的几个方法中出现的 tab_id 可以采用以下任何形式

  • 一个介于零和选项卡数量之间的整数

  • 子窗口的名称

  • 形式为“@x,y”的位置规范,用于标识选项卡

  • 字面字符串“current”,用于标识当前选定的选项卡

  • 字面字符串“end”,返回选项卡数量(仅对 Notebook.index() 有效)

虚拟事件

此小部件在新选项卡被选中后会生成一个 <<NotebookTabChanged>> 虚拟事件。

ttk.Notebook

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

向笔记本添加一个新选项卡。

如果窗口当前由笔记本管理但已隐藏,则将其恢复到以前的位置。

有关可用选项的列表,请参见 选项卡选项

forget(tab_id)

移除由 tab_id 指定的选项卡,取消映射并取消管理关联的窗口。

hide(tab_id)

隐藏由 tab_id 指定的选项卡。

选项卡将不会显示,但关联的窗口仍由笔记本管理,其配置仍被记住。隐藏的选项卡可以使用 add() 命令恢复。

identify(x, y)

返回位于位置 x, y 的选项卡元素的名称,如果没有则返回空字符串。

index(tab_id)

返回由 tab_id 指定的选项卡的数字索引,如果 tab_id 是字符串“end”,则返回选项卡的总数。

insert(pos, child, **kw)

在指定位置插入一个窗格。

pos 是字符串“end”、整数索引或受管子项的名称。如果 child 已由笔记本管理,则将其移动到指定位置。

有关可用选项的列表,请参见 选项卡选项

select(tab_id=None)

选择指定的 tab_id

关联的子窗口将被显示,先前选定的窗口(如果不同)将被取消映射。如果省略 tab_id,则返回当前选定窗格的小部件名称。

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

查询或修改指定 tab_id 的选项。

如果未给出 kw,则返回选项卡选项值的字典。如果指定了 option,则返回该 option 的值。否则,将选项设置为相应的值。

tabs()

返回笔记本管理的窗口列表。

enable_traversal()

为此笔记本所在的顶级窗口启用键盘遍历。

这将扩展包含此笔记本的顶级窗口的绑定,如下所示

  • Control-Tab: 选择当前选定选项卡后的选项卡。

  • Shift-Control-Tab: 选择当前选定选项卡前的选项卡。

  • Alt-K: 其中 K 是任何选项卡的助记符(下划线)字符,将选择该选项卡。

单个顶级窗口中的多个笔记本可以启用遍历,包括嵌套笔记本。但是,笔记本遍历仅在所有窗格都以其所在的笔记本作为主窗格时才能正常工作。

进度条

ttk.Progressbar 小部件显示长时间运行操作的状态。它可以在两种模式下运行:1) 确定模式,显示已完成的工作量相对于总工作量的百分比;2) 不确定模式,提供动画显示以告知用户工作正在进行。

选项

此小部件接受以下特定选项

选项

描述

orient

“horizontal”或“vertical”之一。指定进度条的方向。

length

指定进度条长轴的长度(如果水平,则为宽度;如果垂直,则为高度)。

mode

“determinate”或“indeterminate”之一。

maximum

一个数字,指定最大值。默认为 100。

value (值)

进度条的当前值。在“determinate”模式下,这表示已完成的工作量。在“indeterminate”模式下,它被解释为 maximum 的模;也就是说,当其值增加 maximum 时,进度条完成一个“循环”。

variable (变量)

一个链接到选项值的名称。如果指定,每当此名称的值被修改时,进度条的值将自动设置为此名称的值。

phase

只读选项。当其值大于 0 且在确定模式下小于最大值时,小部件会定期增加此选项的值。当前主题可以使用此选项提供额外的动画效果。

ttk.Progressbar

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

开始自动递增模式:调度一个重复计时器事件,该事件每隔 interval 毫秒调用一次 Progressbar.step()。如果省略 interval,则默认为 50 毫秒。

step(amount=None)

将进度条的值增加 amount

如果省略 amount,则默认为 1.0。

stop()

停止自动递增模式:取消由 Progressbar.start() 为此进度条启动的任何重复计时器事件。

分隔符

ttk.Separator 小部件显示一个水平或垂直分隔条。

除了继承自 ttk.Widget 的方法外,它没有其他方法。

选项

此小部件接受以下特定选项

选项

描述

orient

“horizontal”或“vertical”之一。指定分隔符的方向。

大小调整手柄

ttk.Sizegrip 小部件(也称为可调整大小框)允许用户通过按住并拖动手柄来调整包含顶级窗口的大小。

除了继承自 ttk.Widget 的方法外,此小部件没有特定的选项或方法。

平台特定说明

  • 在 macOS 上,顶级窗口默认自动包含一个内置的大小调整手柄。Sizegrip 的添加是无害的,因为内置手柄只会遮盖小部件。

错误

  • 如果包含顶级窗口的位置是相对于屏幕的右侧或底部指定的(例如...),则 Sizegrip 小部件将不会调整窗口大小。

  • 此小部件仅支持“东南”方向调整大小。

树视图

ttk.Treeview 小部件显示项目的分层集合。每个项目都有一个文本标签、一个可选图像和一个可选的数据值列表。数据值显示在树标签后的后续列中。

数据值的显示顺序可以通过设置小部件选项 displaycolumns 来控制。树形小部件还可以显示列标题。列可以通过数字或小部件选项 columns 中列出的符号名称访问。参见 列标识符

每个项目都由一个唯一的名称标识。如果调用者未提供项目 ID,小部件将生成项目 ID。有一个特殊的根项目,名为 {}。根项目本身不显示;其子项出现在层次结构的顶层。

每个项目还带有一个标签列表,可用于将事件绑定与单个项目关联,并控制项目的外观。

Treeview 小部件支持水平和垂直滚动,具体取决于 可滚动小部件选项 中描述的选项以及 Treeview.xview()Treeview.yview() 方法。

选项

此小部件接受以下特定选项

选项

描述

columns

列标识符列表,指定列数及其名称。

displaycolumns

列标识符(符号或整数索引)列表,指定显示哪些数据列及其出现顺序,或字符串“#all”。

height

指定应可见的行数。注意:请求的宽度由列宽之和确定。

padding

指定小部件的内部填充。填充是一个最多包含四个长度规格的列表。

selectmode

控制内置类绑定如何管理选择。“extended”、“browse”或“none”之一。如果设置为“extended”(默认值),则可以同时选择多个项目。如果为“browse”,则一次只能选择一个项目。如果为“none”,则不会更改选择。

请注意,应用程序代码和标签绑定可以根据需要设置选择,无论此选项的值如何。

show

包含零个或多个以下值的列表,指定要显示树的哪些元素。

  • tree: 在 #0 列显示树标签。

  • headings: 显示标题行。

默认值为“tree headings”,即显示所有元素。

注意:列 #0 总是指树列,即使未指定 show=”tree”。

项目选项

以下项目选项可用于 insert 和 item 小部件命令中的项目。

选项

描述

text

要为项目显示的文本标签。

image

一个 Tk 图像,显示在标签的左侧。

与项目关联的值列表。

每个项目的价值数量应与小部件选项中的列数相同。如果价值数量少于列数,则其余价值假定为空。如果价值数量多于列数,则忽略多余的价值。

打开

True/False 值,指示是否应显示或隐藏该项目的子项。

tags

与此项目关联的标签列表。

标签选项

以下选项可用于标签

选项

描述

foreground

指定文本前景色。

background

指定单元格或项目的背景颜色。

font

指定绘制文本时使用的字体。

image

指定项目图像,如果项目的 image 选项为空。

列标识符

列标识符采用以下任何形式

  • 来自列选项列表中的一个符号名称。

  • 一个整数 n,指定第 n 个数据列。

  • 形式为 #n 的字符串,其中 n 是一个整数,指定第 n 个显示列。

备注

  • 项目的选项值可能以与存储顺序不同的顺序显示。

  • 列 #0 总是指树列,即使未指定 show=”tree”。

数据列号是项目选项值列表中的索引;显示列号是树中显示值的列号。树标签显示在列 #0 中。如果未设置选项 displaycolumns,则数据列 n 显示在列 #n+1 中。再次强调,列 #0 总是指树列

虚拟事件

Treeview 小部件生成以下虚拟事件。

事件

描述

<<TreeviewSelect>>

选择更改时生成。

<<TreeviewOpen>>

在将焦点项设置为 open=True 之前生成。

<<TreeviewClose>>

在将焦点项设置为 open=False 之后生成。

Treeview.focus()Treeview.selection() 方法可用于确定受影响的项目。

ttk.Treeview

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

返回指定 item 在树视图小部件窗口中的边界框,格式为 (x, y, width, height)。

如果指定了 column,则返回该单元格的边界框。如果 item 不可见(即,如果它是已关闭项的后代或已滚动出屏幕),则返回空字符串。

get_children(item=None)

返回属于 item 的子项列表。

如果未指定 item,则返回根子项。

set_children(item, *newchildren)

newchildren 替换 item 的子级。

item 中存在但 newchildren 中不存在的子项将从树中分离。newchildren 中的任何项目都不能是 item 的祖先。请注意,不指定 newchildren 将导致 item 的子项分离。

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

查询或修改指定 column 的选项。

如果未给出 kw,则返回列选项值的字典。如果指定了 option,则返回该 option 的值。否则,将选项设置为相应的值。

有效选项/值为

id

返回列名。这是一个只读选项。

anchor: 标准 Tk 锚点值之一。

指定此列中的文本应相对于单元格如何对齐。

minwidth: 宽度

列的最小宽度(以像素为单位)。当小部件调整大小或用户拖动列时,树视图小部件不会使列小于此选项指定的值。

stretch: True/False

指定小部件调整大小时是否应调整列宽。

width: 宽度

列的宽度(以像素为单位)。

要配置树列,请将 column = “#0” 调用此方法

delete(*items)

删除所有指定的 items 及其所有后代。

根项目不能删除。

detach(*items)

将所有指定的 items 从树中解除链接。

项目及其所有后代仍然存在,可以重新插入到树中的另一个位置,但不会显示。

根项不能分离。

exists(item)

如果指定的 item 存在于树中,则返回 True

focus(item=None)

如果指定了 item,则将焦点项设置为 item。否则,返回当前焦点项,如果没有则返回 ''。

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

查询或修改指定 column 的标题选项。

如果未给出 kw,则返回标题选项值的字典。如果指定了 option,则返回该 option 的值。否则,将选项设置为相应的值。

有效选项/值为

text: 文本

要在列标题中显示的文本。

image: 图像名称

指定在列标题右侧显示的图像。

anchor: 锚点

指定标题文本的对齐方式。标准 Tk 锚点值之一。

command: 回调

按下标题标签时调用的回调函数。

要配置树列标题,请使用 column = “#0” 调用此方法。

identify(component, x, y)

返回指定 componentxy 给定点下的描述,如果该位置没有此类 component,则返回空字符串。

identify_row(y)

返回位置 y 处项目的项目 ID。

identify_column(x)

返回位置 x 处单元格的数据列标识符。

树列的 ID 为 #0。

identify_region(x, y)

返回以下之一

region

含义

heading

树标题区域。

separator

两列标题之间的空间。

tree

树形区域。

cell

数据单元格。

可用性:Tk 8.6。

identify_element(x, y)

返回位置 x, y 处的元素。

可用性:Tk 8.6。

index(item)

返回 item 在其父级子项列表中的整数索引。

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

创建一个新项目并返回新创建项目的项目标识符。

parent 是父项目的项目 ID,或空字符串以创建新的顶级项目。index 是一个整数,或值“end”,指定在新项目的父项子项列表中的插入位置。如果 index 小于或等于零,则新节点插入到开头;如果 index 大于或等于当前子项数,则插入到末尾。如果指定了 iid,则将其用作项目标识符;iid 不得已存在于树中。否则,将生成一个新的唯一标识符。

有关可用选项的列表,请参见 项目选项

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

查询或修改指定 item 的选项。

如果没有给出任何选项,则返回一个包含该项目选项/值的字典。如果指定了 option,则返回该选项的值。否则,将选项设置为 kw 给出的相应值。

move(item, parent, index)

item 移动到 parent 的子项列表中的 index 位置。

将项目移动到其某个后代之下是非法的。如果 index 小于或等于零,则将 item 移动到开头;如果大于或等于子项数,则将其移动到末尾。如果 item 已分离,则重新附加。

next(item)

返回 item 的下一个同级项的标识符,如果 item 是其父项的最后一个子项,则返回 ''。

parent(item)

返回 item 父级的 ID,如果 item 位于层次结构的顶层,则返回 ''。

prev(item)

返回 item 的上一个同级项的标识符,如果 item 是其父项的第一个子项,则返回 ''。

reattach(item, parent, index)

Treeview.move() 的别名。

see(item)

确保 item 可见。

item 的所有祖先的 open 选项设置为 True,并在必要时滚动小部件,使 item 位于树的可见部分内。

selection()

返回一个选定项目的元组。

在 3.8 版本中更改: selection() 不再接受参数。要更改选择状态,请使用以下选择方法。

selection_set(*items)

items 成为新的选择。

在 3.6 版本中更改: items 可以作为单独的参数传递,而不仅仅是作为单个元组。

selection_add(*items)

items 添加到选择中。

在 3.6 版本中更改: items 可以作为单独的参数传递,而不仅仅是作为单个元组。

selection_remove(*items)

从选择中移除 items

在 3.6 版本中更改: items 可以作为单独的参数传递,而不仅仅是作为单个元组。

selection_toggle(*items)

切换 items 中每个项目的选择状态。

在 3.6 版本中更改: items 可以作为单独的参数传递,而不仅仅是作为单个元组。

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

带一个参数时,返回指定 item 的列/值对字典。带两个参数时,返回指定 column 的当前值。带三个参数时,将给定 item 中给定 column 的值设置为指定 value

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

为给定事件 sequence 绑定回调函数到标签 tagname。当事件传递到项目时,将调用项目每个标签选项的回调函数。

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

查询或修改指定 tagname 的选项。

如果未给出 kw,则返回 tagname 的选项设置字典。如果指定了 option,则返回指定 tagname 的该 option 的值。否则,将选项设置为给定 tagname 的相应值。

tag_has(tagname, item=None)

如果指定了 item,则根据指定 item 是否具有给定 tagname 返回 1 或 0。否则,返回所有具有指定标签的项目的列表。

可用性:Tk 8.6

xview(*args)

查询或修改树视图的水平位置。

yview(*args)

查询或修改树视图的垂直位置。

Ttk 样式

ttk 中的每个小部件都被分配一个样式,该样式指定构成小部件的元素集及其排列方式,以及元素选项的动态和默认设置。默认情况下,样式名称与小部件的类名相同,但可以通过小部件的 style 选项覆盖。如果您不知道小部件的类名,请使用方法 Misc.winfo_class() (somewidget.winfo_class())。

参见

Tcl'2004 会议演示

本文档解释了主题引擎的工作原理

class tkinter.ttk.Style

此类用于操作样式数据库。

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

查询或设置 style 中指定选项的默认值。

kw 中的每个键都是一个选项,每个值都是一个字符串,用于标识该选项的值。

例如,要将每个默认按钮更改为带有填充和不同背景颜色的扁平按钮

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)

查询或设置 style 中指定选项的动态值。

kw 中的每个键都是一个选项,每个值都应该是一个列表或(通常)一个元组,其中包含按元组、列表或其他首选项分组的状态规范。状态规范是一个或多个状态的复合体,然后是一个值。

一个例子可能使其更易理解

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

请注意,对于某个选项,(states, value) 序列的顺序确实很重要,例如,如果前景选项的顺序更改为 [('active', 'blue'), ('pressed', 'red')],结果将在小部件处于活动或按下状态时显示蓝色前景。

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

返回 style 中为 option 指定的值。

如果指定了 state,则预期它是一个或多个状态的序列。如果设置了 default 参数,则在找不到选项的规范时,将其用作回退值。

要检查按钮默认使用什么字体

from tkinter import ttk

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

为给定 style 定义小部件布局。如果省略 layoutspec,则返回给定样式的布局规范。

如果指定了 layoutspec,则预期它是一个列表或某些其他序列类型(不包括字符串),其中每个项目都应该是一个元组,第一个项目是布局名称,第二个项目应该具有 布局 中描述的格式。

要了解格式,请参见以下示例(它不打算做任何有用的事情)

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)

在当前主题中创建一个新元素,其 etype 预期为“image”、“from”或“vsapi”。后者仅在 Tk 8.6 的 Windows 上可用。

如果使用“image”,args 应该包含默认图像名称,后跟状态规范/值对(这是图像规范),kw 可能包含以下选项

border=padding

填充是最多四个整数的列表,分别指定左、上、右和下边框。

height=height

指定元素的最小高度。如果小于零,则使用基础图像的高度作为默认值。

padding=padding

指定元素的内部填充。如果未指定,则默认为边框的值。

sticky=spec

指定图像在最终包裹中的放置方式。spec 包含零个或多个字符“n”、“s”、“w”或“e”。

width=width

指定元素的最小宽度。如果小于零,则使用基础图像的宽度作为默认值。

示例

img1 = tkinter.PhotoImage(master=root, file='button.png')
img1 = tkinter.PhotoImage(master=root, file='button-pressed.png')
img1 = tkinter.PhotoImage(master=root, file='button-active.png')
style = ttk.Style(root)
style.element_create('Button.button', 'image',
                     img1, ('pressed', img2), ('active', img3),
                     border=(2, 4), sticky='we')

如果将“from”用作 etype 的值,element_create() 将克隆现有元素。args 预计包含一个主题名称,从中克隆元素,以及一个可选的要克隆的元素。如果未指定要克隆的元素,则将使用空元素。kw 将被丢弃。

示例

style = ttk.Style(root)
style.element_create('plain.background', 'from', 'default')

如果“vsapi”用作 etype 的值,element_create() 将在当前主题中创建一个新元素,其视觉外观使用 Microsoft Visual Styles API 绘制,该 API 负责 Windows XP 和 Vista 上的主题样式。args 预计包含 Microsoft 文档中给出的 Visual Styles 类和部分,然后是一个可选的 ttk 状态元组序列和相应的 Visual Styles API 状态值。kw 可以有以下选项

padding=padding

指定元素的内部填充。padding 是一个最多包含四个整数的列表,分别指定左、上、右和下填充量。如果指定的元素少于四个,则底部默认为顶部,右侧默认为左侧,顶部默认为左侧。换句话说,一个包含三个数字的列表指定左侧、垂直和右侧填充;一个包含两个数字的列表指定水平和垂直填充;一个数字指定小部件周围的相同填充。此选项不能与其他任何选项混合使用。

margins=padding

指定元素的外部填充。padding 是一个最多包含四个整数的列表,分别指定左、上、右和下填充量。此选项不能与其他任何选项混合使用。

width=width

指定元素的宽度。如果设置此选项,则不会查询 Visual Styles API 以获取推荐大小或部分。如果设置此选项,则 height 也应设置。widthheight 选项不能与 paddingmargins 选项混合使用。

height=height

指定元素的高度。请参阅 width 的注释。

示例

style = ttk.Style(root)
style.element_create('pin', 'vsapi', 'EXPLORERBAR', 3, [
                     ('pressed', '!selected', 3),
                     ('active', '!selected', 2),
                     ('pressed', 'selected', 6),
                     ('active', 'selected', 5),
                     ('selected', 4),
                     ('', 1)])
style.layout('Explorer.Pin',
             [('Explorer.Pin.pin', {'sticky': 'news'})])
pin = ttk.Checkbutton(style='Explorer.Pin')
pin.pack(expand=True, fill='both')

版本 3.13 中有更改: 添加了对“vsapi”元素工厂的支持。

element_names()

返回当前主题中定义的元素列表。

element_options(elementname)

返回 elementname 的选项列表。

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

创建一个新主题。

如果 themename 已经存在,则会出错。如果指定了 parent,新主题将从父主题继承样式、元素和布局。如果存在 settings,则它们预计具有与 theme_settings() 相同的语法。

theme_settings(themename, settings)

暂时将当前主题设置为 themename,应用指定的 settings,然后恢复之前的主题。

settings 中的每个键都是一个样式,每个值可能包含键“configure”、“map”、“layout”和“element create”,并且它们预计具有与方法 Style.configure()Style.map()Style.layout()Style.element_create() 分别指定的格式相同。

例如,让我们稍微改变一下默认主题的 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,刷新所有小部件并发出 <> 事件。

布局

布局可以是 None,如果它不带选项,也可以是指定如何安排元素的选项字典。布局机制使用简化版的 pack 几何管理器:给定一个初始空腔,每个元素都会分配一个包裹。

有效选项/值为

side: whichside

指定将元素放置在空腔的哪一侧;可以是顶部、右侧、底部或左侧之一。如果省略,则元素占据整个空腔。

sticky: nswe

指定元素在其分配的包裹内的位置。

unit: 0 或 1

如果设置为 1,则使元素及其所有后代在 Widget.identify() 等操作中被视为单个元素。它用于带有握把的滚动条拇指等。

children: [子布局…]

指定要放置在元素内的元素列表。每个元素都是一个元组(或其他序列类型),其中第一项是布局名称,另一项是 布局