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
控件均可设置以下属性:
takefocus
决定了窗口是否可用键盘获得焦点。返回 0 、1 或空字符串。若返回 0,则表示在用键盘遍历时应该跳过该窗口。如果为 1,则表示只要窗口可见即应接收输入焦点。而空字符串则表示由遍历代码决定窗口是否接收焦点。
style
可用于指定自定义控件样式。
用于与水平滚动条通讯.
当窗口中的可见内容发生变化时,控件将根据 scrollcommand 生成 Tcl 命令。
通常该属性由一些滚动条的 Scrollbar.set()
方法组成。当窗口中的可见内容发生变化时,将会刷新滚动条的状态。
yscrollcommand
用于与垂直滚动条通讯,更多信息请参考上一条。
image
指定一个用于显示的图片。这是一个由1个或多个元素组成的列表。第一个元素是默认的图片名称。列表的其余部分是由 Style.map()
定义的“状态/值对”的序列,指定控件在某状态或状态组合时要采用的图片。列表中的所有图片应具备相同的尺寸。
compound
指定同时存在 text 和 image 属性时,应如何显示文本和对应的图片。合法的值包括:
text::只显示文本
image:只显示图片
top、bottom、left、right:分别在文本的上、下、左、右显示图片。
none:默认值。 如果给出了图片则显示,否则显示文本。
width
如果值大于零,指定文本标签留下多少空间,单位是字符数;如果值小于零,则指定最小宽度。如果等于零或未指定,则使用文本标签本身的宽度。
ttk.Widget
除了以下方法之外,ttk.Widget
还支持 tkinter.Widget.cget()
和 tkinter.Widget.configure()
方法。
class tkinter.ttk.
Widget
identify
(x, y)
返回位于 x y 的控件名称,如果该坐标点不属于任何控件,则返回空字符串。
x 和 y 是控件内的相对坐标,单位是像素。
state
(statespec=None)
修改或查询部件状态。 如果指定了 statespec,则会用它来设置部件状态并返回一个新的 statespec 来指明哪些旗标做过改动。 如果未指定 statespec,则返回当前启用的状态旗标。
statespec 通常是个列表或元组。
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
中都有介绍。
控件可设置以下属性:
state
normal 、readonly 或 disabled。在 readonly 状态下,数据不能直接编辑,用户只能从下拉列表中选取。在 normal 状态下,可直接编辑文本框。在 disabled 状态下,无法做任何交互。
textvariable
设置一个变量名,其值与控件的值关联。每当该变量对应的值发生变动时,控件值就会更新,反之亦然。参见 tkinter.StringVar
。
values
设置显示于下拉列表中的值。
width
设置为整数值,表示输入窗口的应有宽度,单位是字符单位(控件字体的平均字符宽度)。
Spinbox
ttk.Spinbox
控件是 ttk.Entry
的扩展,带有递增和递减箭头。可用于数字或字符串列表。这是 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
中都有介绍。
控件可设置以下属性:
padding
指定在控件外部添加的留白。padding 是最多包含四个值的列表,指定左顶右底的空间。如果给出的元素少于四个,底部值默认为顶部值,右侧值默认为左侧值,顶部值默认为左侧值。
width
若给出且大于 0,则设置面板的应有宽度(不含内部 padding)。否则将采用所有子窗口面板的最大宽度。
sticky
指定子窗口在面板内的定位方式。应为包含零个或多个 n、s、e 、w 字符的字符串。每个字母表示子窗口应紧靠的方向(北、南、东或西),正如 grid()
位置管理器所述。
padding
指定控件和面板之间的留白空间。格式与本控件的 padding 属性相同。
指定显示在 tab 上的文本。
image
指定显示在 tab 上的图片。参见 Widget
的 image 属性。
compound
当文本和图片同时存在时,指定图片相对于文本的显示位置。合法的属性值参见 Label Options 。
underline
指定下划线在文本字符串中的索引(基于0)。如果调用过了 Notebook.enable_traversal()
,带下划线的字符将用于激活快捷键。
Tab ID
The tab_id present in several methods of ttk.Notebook
may take any
of the following forms:
介于 0 和 tab 总数之间的整数值。
子窗口的名称。
以“@x,y”形式给出的位置,唯一标识了 tab 页。
字符串字面值 "current",它标识当前被选中的选项卡
字符串字面值 "end",它返回标签页的数量 (仅适用于 Notebook.index()
)
虚拟事件
当选中一个新 tab 页之后,控件会生成一条 <<NotebookTabChanged>> 虚拟事件。
ttk.Notebook
class tkinter.ttk.
Notebook
add
(child, **kw)
添加一个新 tab 页。
如果窗口是由 Notebook 管理但处于隐藏状态,则会恢复到之前的位置。
可用的選項清單請見 Tab Options。
insert
(pos, child, **kw)
在指定位置插入一个 tab。
pos 可为字符串“end” 、整数索引值或子窗口名称。如果 child 已由 Notebook 管理,则将其移至指定位置。
可用的選項清單請見 Tab Options。
Control-Tab :选中当前 tab 之后的页。
Shift-Control-Tab :选中当前 tab 之前的页。
Alt-K :这里 K 是任意 tab 页的快捷键(带下划线)字符,将会直接选中该 tab。
一个顶层窗口中可为多个 Notebook 启用键盘遍历,包括嵌套的 Notebook 。但仅当所有面板都将所在 Notebook 作为父控件时,键盘遍历才会生效。
Progressbar
ttk.Progressbar
控件可为长时间操作显示状态。可工作于两种模式:1)determinate 模式,显示相对完成进度;2) indeterminate 模式,显示动画让用户知道工作正在进行中。
控件可设置以下属性:
value
进度条的当前值。在 determinate 模式下代表已完成的工作量。在 indeterminate 模式下,解释为 maximum 的模;也就是说,当本值增至 maximum 时,进度条完成了一个“周期”。
variable
与属性值关联的变量名。若给出,则当变量值变化时会自动设为进度条的值。
phase
只读属性。只要值大于 0 且在 determinate 模式下小于最大值,控件就会定期增大该属性值。当前主题可利用本属性提供额外的动画效果。
Treeview
ttk.Treeview
控件可将多项内容分层级显示。每个数据项都带有一个文本标签、一个可选的图片和一个可选的数据值列表。 这些数据值将在树标签后面分列显示。
数据值的显示顺序可用属性 displaycolumns
进行控制。树控件还可以显示列标题。数据列可通过数字或名称进行访问,各列的名称在属性 columns 中列出。参阅 Column Identifiers。
每个数据项都由唯一名称进行标识。如果调用者未提供数据项的 ID,树控件会自动生成。根有且只有一个,名为 {}
。根本身不会显示出来;其子项将显示在顶层。
每个数据项均带有一个 tag 列表,可用于绑定事件及控制外观。
Treeview 组件支持水平和垂直滚动,滚动时会依据 Scrollable Widget Options 描述的属性和 Treeview.xview()
和 Treeview.yview()
方法。
控件可设置以下属性:
selectmode
控制内部类如何进行选中项的管理。可为 extended、browse 或 none。若设为 extended(默认),则可选中多个项。若为 browse ,则每次只能选中一项。若为 none,则无法修改选中项。
请注意,代码和 tag 绑定可自由进行选中操作,不受本属性的限制。
由0个或下列值组成的列表,指定要显示树的哪些元素。
tree :在 #0 列显示树的文本标签。
headings :显示标题行。
默认为“tree headings”,显示所有元素。
** 注意** :第 #0 列一定是指 tree 列,即便未设置 show="tree" 也一样。
values
关联的数据值列表。
每个数据项关联的数据数量应与 columns 属性相同。如果比 columns 属性的少,剩下的值将视为空。如果多于 columns 属性的,多余数据将被忽略。
True
或 False
,表明是否显示数据项的子树。
与该数据项关联的 tag 列表。
#0 列一定是指 tree 列,即便未指定 show="tree" 也是一样。
数据列号是指属性值列表中的索引值,显示列号是指显示在树控件中的列号。树的文本标签将显示在 #0 列。如果未设置 displaycolumns 属性,则数据列 n 将显示在第 #n+1 列。再次强调一下,#0 列一定是指 tree 列 。
虚拟事件
Treeview 控件会生成以下虚拟事件。
column
(column, option=None, **kw)
查询或修改列 column 的属性。
如果未给出 kw,则返回属性值的字典。若指定了 option,则会返回该属性值。否则将设置属性值。
合法的 属性/值 可为:
id返回列名。这是只读属性。
heading
(column, option=None, **kw)
查询或修改某 column 的标题。
若未给出 kw,则返回列标题组成的列表。若给出了 option 则返回对应属性值。否则,设置属性值。
合法的 属性/值 可为:
text:文本。显示为列标题的文本。
insert
(parent, index, iid=None, **kw)
新建一个数据项并返回其 ID。
parent 是父项的 ID,若要新建顶级项则为空字符串。 index 是整数或“end”,指明在父项的子项列表中的插入位置。如果 index 小于等于0,则在开头插入新节点;如果 index 大于或等于当前子节点数,则将其插入末尾。如果给出了 iid,则将其用作数据项 ID; iid 不得存在于树中。否则会新生成一个唯一 ID。
此处可设置的属性请参阅 Item Options 。
tag_has
(tagname, item=None)
如果给出了 item ,则依据 item 是否具备 tagname 而返回 1 或 0。否则,返回 tag 为 tagname 的所有数据项构成的列表。
可用性:Tk 8.6。
Ttk 样式
ttk
的每种控件都赋有一个样式,指定了控件内的元素及其排列方式,以及元素属性的动态和默认设置。默认情况下,样式名与控件的类名相同,但可能会被控件的 style 属性覆盖。如果不知道控件的类名,可用 Misc.winfo_class()
方法获取(somewidget.winfo_class())。
Tcl'2004 会议报告文章解释了主题引擎的工作原理。
configure
(style, query_opt=None, **kw)
查询或设置 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)
查询或设置 style 的指定属性的动态值。
kw 的每个键都是一个属性,每个值通常应为列表或元组,其中包含以元组、列表或其他形式组合而成的状态标识(statespec)。状态标识是由一个或多个状态组合,加上一个值组成。
举个例子能更清晰些:
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()
请注意,要点是属性的(状态,值)序列的顺序,如果前景色属性的顺序改为 [('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,则应为一个列表或其他的序列类型(不包括字符串),其中的数据项应为元组类型,第一项是布局名称,第二项的格式应符合 Layouts 的描述。
以下示例有助于理解这种格式(这里并没有实际意义):
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。后者仅在 Windows XP 和 Vista 版的 Tk 8.6a 中可用,此处不再赘述。
如果用了 image,则 args 应包含默认的图片名,后面跟着 状态标识/值(这里是 imagespec),kw 可带有以下属性:
border=paddingpadding 是由不超过四个整数构成的列表,分别定义了左、顶、右、底的边界。
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()
© 版權 2001-2023, Python Software Foundation.
This page is licensed under the Python Software Foundation License Version 2.
Examples, recipes, and other code in the documentation are additionally licensed under the Zero Clause BSD License.
See History and License for more information.
The Python Software Foundation is a non-profit corporation.
Please donate.
最後更新於 11月 14, 2023。
Found a bug?