24.2. ttk — Tk 主题小部件

ttk模块提供对 Tk 主题小部件集的访问,该主题集已在 Tk 8.5 中引入。如果未根据 Tk 8.5 编译 Python,只要安装了 Tile,该代码仍可以使用此模块。但是,新 Tk 提供的某些Function(如 X11 下的抗锯齿字体渲染,窗口透明性(在 X11 上您将需要一个合成窗口 Management 器))将丢失。

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

See also

24.2.1. 使用 Ttk

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

import ttk

但是这样的代码:

from Tkinter import *

可能需要使用此选项:

from Tkinter import *
from ttk import *

然后,几个ttk小部件(ButtonCheckbuttonEntryFrameLabelLabelFrameMenubuttonPanedWindowRadiobuttonScaleScrollbar)将自动替换 Tk 小部件。

这具有使用新窗口小部件的直接好处,可在各个平台上提供更好的外观,但请注意它们并不完全兼容。主要区别在于,Ttk 小部件中不再存在诸如“ fg”,“ bg”之类的小部件选项以及其他与小部件样式相关的选项。使用ttk.Style可以达到相同(或更好)的样式。

See also

24.2.2. Ttk 小部件

Ttk 带有 17 个小部件,其中 11 个已在 Tkinter 中存在:ButtonCheckbuttonEntryFrameLabelLabelFrameMenubuttonPanedWindowRadiobuttonScaleScrollbar。 6 个新的窗口小部件类是:ComboboxNotebookProgressbarSeparatorSizegripTreeview。所有这些类都是Widget的子类。

如前所述,您会注意到外观和样式代码中的变化。为了演示后者,下面显示了一个非常简单的示例。

Tk code:

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类文档。

24.2.3. Widget

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

24.2.3.1. 标准选项

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

Note

Option Description
class 指定窗口类。在选项数据库中查询窗口的其他选项,确定窗口的默认绑定标签以及选择窗口小部件的默认布局和样式时,使用该类。这是一个只读选项,只能在创建窗口时指定。
cursor 指定用于窗口小部件的鼠标光标。如果设置为空字符串(默认值),则光标将从父窗口小部件继承。
takefocus 确定在键盘遍历期间窗口是否接受焦点。 0、1 或返回空字符串。如果为 0,则在遍历键盘时应完全跳过窗口。如果为 1,则窗口应在可见的范围内接收 Importing 焦点。空字符串表示遍历脚本将决定是否将焦点放在窗口上。
style 可用于指定自定义窗口小部件样式。

24.2.3.2. 可滚动小部件选项

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

Note

option description
xscrollcommand 用于与水平滚动条进行通信。


> 当窗口小部件窗口中的视图更改时,窗口小部件将基于滚动命令生成 Tcl 命令。

> 通常,此选项由某些滚动条的Scrollbar.set()方法组成。每当窗口中的视图更改时,这将导致滚动条被更新。
| yscrollcommand |用于与垂直滚动条进行通信。有关更多信息,请参见上文。

24.2.3.3. 标签选项

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

Note

option description
text 指定要在小部件内显示的文本字符串。
textvariable 指定一个名称,该名称的值将代替文本选项资源。
underline 如果设置,则指定要在文本字符串中加下划线的字符的索引(从 0 开始)。下划线字符用于助记符激活。
image 指定要显示的图像。这是 1 个或多个元素的列表。第一个元素是默认图像名称。列表的其余部分是由Style.map()定义的状态规范/值对的序列,指定了在小部件处于特定状态或状态组合时要使用的不同图像。列表中的所有图像应具有相同的尺寸。
compound 指定在同时显示文本和图像选项的情况下如何显示相对于文本的图像。有效值为:


> Literals:仅显示 Literals

> 图片:仅显示图片

> 顶部,底部,左侧,右侧:分别在文本上方,下方,左侧或右侧显示图像。

> none:默认值。显示图像(如果存在),否则显示文本。
| width |如果大于零,则指定为文本标签分配多少空间(以字符宽度为单位);如果小于零,则指定最小宽度。如果为零或未指定,则使用文本标签的自然宽度。

24.2.3.4. 相容性选项

Note

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

24.2.3.5. 小部件状态

小部件状态是独立状态标志的位图。

Note

flag description
active 鼠标光标在小部件上,按下鼠标按钮将引起一些动作。
disabled 小部件在程序控制下被禁用。
focus 小部件具有键盘焦点。
pressed 小部件被按下。
selected “开”,“真”或“当前”,用于诸如 Checkbutton 和单选按钮之类的东西。
background Windows 和 Mac 具有“活动”或前景窗口的概念。在后台窗口中为窗口小部件设置了* background 状态,在前台窗口中为那些窗口小部件清除了 background *状态。
readonly 小部件不应允许用户修改。
alternate 特定于窗口小部件的备用显示格式。
invalid 窗口小部件的值无效。

状态规范是状态名称的序列,可以选择在其前面加上表示该位为 OFF 的感叹号。

24.2.3.6. ttk.Widget

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

24.2.4. 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中描述了其他方法。

24.2.4.1. Options

该小部件接受以下选项:

Note

option description
exportselection 布尔值。如果设置,则将小部件选择链接到“窗口 Management 器”选择(例如,可以pass调用Misc.selection_get()返回)。
justify 指定文本在小部件内的对齐方式。 “左”,“中心”或“右”之一。
height 指定弹出式列表框的高度,以行为单位。
postcommand 在显示值之前立即调用的脚本(可能已向Misc.register()注册)。它可以指定要显示的值。
state “正常”,“只读”或“禁用”之一。在“只读”状态下,可能无法直接编辑该值,并且用户只能从下拉列表中选择一个值。在“正常”状态下,文本字段可直接编辑。在“禁用”状态下,无法进行任何交互。
textvariable 指定一个名称,该名称的值链接到窗口小部件值。每当与该名称关联的值更改时,小部件值都会更新,反之亦然。参见Tkinter.StringVar
values 指定要显示在下拉列表框中的值列表。
width 指定一个整数值,以小部件字体的平均大小字符表示 Importing 窗口的所需宽度。

24.2.4.2. 虚拟活动

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

24.2.4.3. ttk.Combobox

24.2.5. Notebook

“ Ttk 笔记本”窗口小部件 Management 一组窗口并一次显示一个窗口。每个子窗口都与一个选项卡相关联,用户可以选择一个选项卡来更改当前显示的窗口。

24.2.5.1. Options

该小部件接受以下特定选项:

Note

option description
height 如果存在且大于零,则指定窗格区域的期望高度(不包括内部填充或制表符)。否则,将使用所有窗格的最大高度。
padding 指定要在笔记本计算机外部添加的额外空间量。填充是最多四个长度规范的列表:左上右下。如果指定的元素少于四个,则 bottom 默认为 top,right 默认为 left,top 默认为 left。
width 如果存在且大于零,则指定窗格区域的所需宽度(不包括内部填充)。否则,将使用所有窗格的最大宽度。

24.2.5.2. 标签选项

选项卡也有特定的选项:

Note

option description
state “正常”,“禁用”或“隐藏”。如果“禁用”,则该选项卡不可选择。如果为“隐藏”,则不显示该选项卡。
sticky 指定子窗口在窗格区域内的放置方式。值是一个包含零个或多个字符“ n”,“ s”,“ e”或“ w”的字符串。根据grid()几何图形 Management 器,每个字母都表示子窗口将粘贴的一侧(北,南,东或西)。
padding 指定要在笔记本和此窗格之间添加的额外空间量。语法与此小部件使用的选项填充相同。
text 指定要在选项卡中显示的文本。
image 指定要在选项卡中显示的图像。请参阅Widget中描述的选项图像。
compound 指定在同时显示文本和图像选项的情况下如何显示相对于文本的图像。合法值请参见Label Options
underline 指定要在文本字符串中加下划线的字符的索引(从 0 开始)。如果调用了Notebook.enable_traversal(),则带下划线的字符用于助记符激活。

24.2.5.3. 标签标识符

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

24.2.5.4. 虚拟活动

选择新选项卡后,此窗口小部件将生成 <> 虚拟事件。

24.2.5.5. ttk.Notebook

如果窗口当前由笔记本计算机 Management 但被隐藏,则它将恢复到其先前位置。

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

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

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

将显示关联的子窗口,并且未 Map 先前选择的窗口(如果不同)。如果Ellipsis* tab_id *,则返回当前所选窗格的窗口小部件名称。

如果未提供* kw ,则返回制表符选项值的字典。如果指定了 option ,则返回该 option *的值。否则,将选项设置为相应的值。

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

可以启用单个顶层中的多个笔记本进行遍历,包括嵌套的笔记本。但是,笔记本遍历仅在所有窗格都将其笔记本作为主窗格的情况下才能正常运行。

24.2.6. Progressbar

ttk.Progressbar小部件显示长时间运行的状态。它可以在两种模式下运行:确定模式显示相对于要完成的工作总量的完成数量,确定模式提供动画显示,以使用户知道正在发生的事情。

24.2.6.1. Options

该小部件接受以下特定选项:

Note

option description
orient “水平”或“垂直”之一。指定进度条的方向。
length 指定进度条长轴的长度(水平时为宽度,垂直时为高度)。
mode “确定”或“不确定”之一。
maximum 一个数字,指定最大值。默认为 100.
value 进度栏的当前值。在“确定”模式下,这表示完成的工作量。在“不确定”模式下,它被解释为模最大;也就是说,进度条的值增加* maximum *时,它完成一个“周期”。
variable 与选项值链接的名称。如果指定了该名称,则进度栏的值将在修改后自动设置为该名称的值。
phase 只读选项。每当其值大于 0 且在确定模式下小于最大值时,小部件会定期增加此选项的值。当前主题可以使用此选项来提供其他动画效果。

24.2.6.2. ttk.Progressbar

24.2.7. Separator

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

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

24.2.7.1. Options

该小部件接受以下特定选项:

Note

option description
orient “水平”或“垂直”之一。指定分隔符的方向。

24.2.8. Sizegrip

ttk.Sizegrip小部件(也称为“增长框”)允许用户pass按下和拖动手柄来调整包含的顶层窗口的大小。

除了从ttk.Widget继承的控件外,此小部件既没有特定的选项也没有特定的方法。

24.2.8.1. 特定于平台的说明

24.2.8.2. Bugs

24.2.9. Treeview

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

可以pass设置小部件选项displaycolumns来控制数据值的显示 Sequences。树小部件还可以显示列标题。可以pass窗口小部件选项列中列出的数字或符号名来访问列。参见Column Identifiers

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

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

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

24.2.9.1. Options

该小部件接受以下特定选项:

Note

option description
columns 列标识符的列表,用于指定列数及其名称。
displaycolumns 列标识符(符号或整数索引)的列表,用于指定显示哪些数据列及其出现的 Sequences,或字符串“ #all”。
height 指定应该可见的行数。注意:请求的宽度由列宽度的总和确定。
padding 指定窗口小部件的内部填充。填充是最多四个长度规范的列表。
selectmode 控制内置类绑定如何 Management 选择。 “扩展”,“浏览”或“无”之一。如果设置为“扩展”(默认),则可以选择多个项目。如果为“浏览”,则一次将仅选择一个项目。如果为“ none”,则选择不会更改。


> 请注意,无论此选项的值如何,应用程序代码和标签绑定都可以根据需要设置选择。
|显示|一个包含零个或多个以下值的列表,指定要显示树的哪些元素。

> tree:在第 0 列中显示树标签。

> 标题:显示标题行。

> 默认值为“树标题”,即显示所有元素。

> 注意 :即使未指定 show =“ tree”,列#0 始终引用树列。

24.2.9.2. 项目选项

可以在插入和项目小部件命令中为项目指定以下项目选项。

Note

option description
text 要显示的文本标签。
image Tk 图像,显示在标签的左侧。
values 与项目关联的值列表。


> 每个项目应具有与小部件选项列相同数量的值。如果值少于列,则剩余的值将被认为是空的。如果值比列多,则多余的值将被忽略。
|| open/True/False 值,指示应显示还是隐藏该项目的子项。
| tags |与此项目关联的标签列表。

24.2.9.3. 标签选项

可以在标签上指定以下选项:

Note

option description
foreground 指定文本前景色。
background 指定单元格或项目的背景色。
font 指定在绘制文本时使用的字体。
image 如果项目的图像选项为空,则指定项目图像。

24.2.9.4. 列标识符

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

Notes:

数据列号是项的选项值列表的索引;显示列号是显示值的树中的列号。树标签显示在#0 列中。如果未设置选项 displaycolumns,那么数据列 n 将显示在列#n 1 中。同样, 列#0 始终引用树列

24.2.9.5. 虚拟活动

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

Note

event description
<<TreeviewSelect>> 每当选择更改时生成。
<<TreeviewOpen>> 在将焦点项设置为 open = True 之前生成。
<<TreeviewClose>> 将焦点项设置为 open = False 后立即生成。

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

24.2.9.6. ttk.Treeview

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

如果未指定* item *,则返回 root 子代。

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

有效的选项/值是:

要配置树列,请使用 column =“#0”进行调用

根项目可能不会被删除。

这些项目及其所有后代仍然存在,可以在树的另一点重新插入,但不会显示。

根项目可能无法分离。

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

有效的选项/值是:

要配置树的列标题,请使用 column =“#0”进行调用。

树列的 ID 为 0.

region meaning
heading 树标题区域。
separator 两列标题之间的空格。
tree 树区。
cell 数据单元。

可用性:Tk 8.6.

可用性:Tk 8.6.

有关可用点的列表,请参见Item Options

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

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

将所有* item 的祖先打开选项设置为True,并在必要时滚动小部件,以使 item *在树的可见部分内。

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

可用性:Tk 8.6

24.2.10. Ttk 样式

ttk中的每个窗口小部件都分配有一种样式,该样式指定组成窗口小部件的元素集以及它们的排列方式,以及元素选项的动态和默认设置。默认情况下,样式名称与窗口小部件的类名相同,但是可以由窗口小部件的样式选项覆盖。如果小部件的类名未知,请使用方法Misc.winfo_class()(somewidget.winfo_class())。

See also

例如,要将每个默认按钮更改为带有一些填充和不同背景颜色的平面按钮,请执行以下操作:

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

An example:

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

请注意,选项的(状态,值)序列的 Sequences 很重要。在上一个示例中,例如,如果在前台选项中将 Sequences 更改为[('active', 'blue'), ('pressed', 'red')],则当小部件处于活动或按下状态时,您将看到蓝色的前台。

如果指定了* state ,则应为一个或多个状态的序列。如果设置了 default *参数,则在找不到选项说明的情况下,它将用作备用值。

要检查默认情况下 Button 使用的字体,请执行以下操作:

import ttk

print ttk.Style().lookup("TButton", "font")

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

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

如果使用“图像”,则* args 应该包含默认的图像名称,后跟 statespec/value 对(这是 imagespec),并且 kw *可能具有以下选项:

Note

    • border=padding
  • padding 是最多四个整数的列表,分别指定左边界,上边界,右边界和下边界。

    • height=height
  • 指定元素的最小高度。如果小于零,则默认使用基本图像的高度。

    • padding=padding
  • 指定元素的内部填充。如果未指定,则默认为 border 的值。

    • sticky=spec
  • 指定如何在finally宗地中放置图像。 spec 包含零个或多个字符“ n”,“ s”,“ w”或“ e”。

    • width=width
  • 指定元素的最小宽度。如果小于零,则默认使用基本图像的宽度。

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

如果* themename 已经存在,这是一个错误。如果指定了 parent ,则新主题将从父主题继承样式,元素和布局。如果存在 settings *,则它们应具有与theme_settings()相同的语法。

例如,让我们稍微更改默认主题的组合框:

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

24.2.10.1. Layouts

如果布局不包含任何选项,则布局可以只是None,也可以是用于指定元素布置方式的选项命令。布局机制使用了打包几何 Management 器的简化版本:给定一个初始腔,为每个元素分配一个地块。有效的选项/值是:

Note

    • side: whichside
  • 指定放置元件的腔的哪一侧;顶部,右侧,底部或左侧之一。如果Ellipsis,则该元素将占据整个空腔。

    • sticky: nswe
  • 指定将元素放置在其分配的宗地内的位置。

    • 单位:0 或 1
  • 如果设置为 1,则出于Widget.identify()等人的目的,将该元素及其所有后代视为一个元素。它用于带有手柄的滚动条拇指之类的东西。

    • children: [sublayout… ]
  • 指定要放置在元素内部的元素列表。每个元素都是一个 Tuples(或其他序列类型),其中第一项是布局名称,另一个是Layout

首页