tkinter 的子模块 ttk
本文主要介绍 tkinter
子模块的特性,以及和原生 tkinter
控件之间的区别。
tkinter.ttk
模块提供了对 tk
风格控件集合的访问途径,在 tkinter 8.5
中引入。
引入 tkinter.ttk
的基本思想是尽可能将实现控件行为的代码与实现其外观的代码分开。
如果用一句话解释引入 ttk
的目的,那就是:
使用 ttk
控件可以改善应用程序的外观和感觉。
ttk
模块是 tkinter
的新特性,因此,建议使用 ttk
控件作为开发和学习的重点。
如何创建 ttk 控件
创建 ttk
控件的方法和 tkinter
控件的方法略有不同:
创建一个 tkinter
按钮:
from tkinter import *
root = Tk()
btn = Button(root,text="tkinter 按钮")
btn.pack()
root.mainloop()
创建一个 ttk
按钮:
from tkinter import *
from tkinter import ttk
root = Tk()
btn = ttk.Button(root,text="ttk 按钮")
btn.pack()
root.mainloop()
以下是两段代码的执行结果:
从截图可以明显看出 tkinter
原生按钮的样式和 ttk
模块按钮的默认样式是不一样的。
如何设置 ttk 控件的样式
ttk
子模块的引出,主要目的是解决界面美观度和分离控制代码和样式代码的目的。
所以 ttk
在样式控制上和 tkinter
有较大区别。
下面以 Label
对象为例,通过创建一个蓝底红字的标签,说明二者的主要区别:
使用 tkinter
控件的代码:
from tkinter import *
root = Tk()
l1 = Label(text="label1",fg="red",bg="blue")
l1.pack()
root.mainloop()
使用 ttk
控件的代码:
from tkinter import *
from tkinter import ttk
root = Tk()
style_default = ttk.Style()
style_default.configure("TLabel",foreground="red",background="blue")
l1 = ttk.Label(root,text="lable1",style='TLabel')
l1.pack()
root.mainloop()
以下是代码执行的结果:
二者在展示效果上基本没有区别,主要区别在代码的编写上。
由于 ttk
分离了控件的创建代码和样式代码,所以代码看起来比较复杂,行数较多。
实际上,ttk
由于抽离了样式代码,同样的样式只需要写一次,在创建控件的时候可以直接引用,所以当控件较多时,会极大的降低工作和代码量。
而 tkinter
原生控件每次创建一个控件,都需要写一遍样式代码,所以不适合使用在稍微复杂一点的应用中。
ttk 支持的控件
ttk
带有17个控件,其中11个已经存在于 tkinter
中:Button
,Checkbutton
,Entry
,Frame
,Label
,LabelFrame
,Menubutton
,PanedWindow
,Radiobutton
,Scale
和 Scrollbar
。
6个新的窗口控件类是:Combobox
,Notebook
,Progressbar
,Separator
,Sizegrip
和 Treeview
。 所有这些类都是Widget的子类。
ttk 控件通用参数
ttk.Widget
类定义了 tk
风格控件的标准可选参数和通用方法,该类类似于 Java
中的接口,不应该直接实例化。
- 所有
ttk
控件都能接受以下参数:
参数 | 描述 |
---|---|
class | 指定窗口类。 该类用于在选项数据库中查询窗口的其他选项、确定窗口的默认绑定标签以及选择控件的默认布局和样式。 此选项是只读的,只能在创建窗口时指定。 |
cursor | 指定要用于控件的鼠标光标。 如果设置为空字符串(默认值),从父控件继承光标。 |
takefocus | 确定窗口在键盘遍历期间是否接受焦点。 返回 0、1 或空字符串。 如果返回 0,则表示在键盘遍历期间应完全跳过该窗口。 如果为 1,则表示只要窗口可见,就应该接收输入焦点。 空字符串意味着遍历脚本决定是否关注窗口。 |
style | 可用于指定控件样式。 |
- 可滚动控件的通用可选参数
具备滚动条的控件支持以下可选参数:
参数 | 描述 |
---|---|
xscrollcommand | 用于与水平滚动条通信。当widget窗口中的视图发生变化时,widget会根据scrollcommand生成Tcl命令。通常这个选项由一些滚动条的Scrollbar.set()方法组成。 这将导致滚动条在窗口中的视图发生变化时更新。 |
yscrollcommand | 用于与垂直滚动条通信。 有关更多信息,请参见上文。 |
- 标签类控件的通用参数
Label
、Button
和类Button
控件支持以下可选参数:
参数 | 描述 |
---|---|
text | 指定在控件中展示的字符串 |
textvariable | 指定一个变量名,这个变量的值会填充text参数,展示在控件中。 |
underline | 如果设置,则指定要在文本字符串中加下划线的字符的索引(从 0 开始)。 下划线字符用于助记符激活。 |
image | 指定要显示的图像。 这是一个包含 1 个或多个元素的列表。 第一个元素是默认图像名称。 列表的其余部分是由 Style.map() 定义的一系列 statespec/value 对,指定当小部件处于特定状态或状态组合时要使用的不同图像。 列表中的所有图像都应具有相同的大小。 |
compound | 在文本和图像选项都存在的情况下,指定如何相对于文本显示图像。 有效值为:text:仅显示文本;image:仅显示图像;top、bottom、left、right:分别显示文本的上方、下方、左侧或右侧的图像。none:默认值。 显示图像(如果存在),否则显示文本。 |
width | 如果大于零,则指定为文本标签分配多少字符宽度的空间,如果小于零,则指定最小宽度。 如果为零或未指定,则使用文本标签的自然宽度。 |
- 兼容性选项
参数 | 描述 |
---|---|
state | 可设置为 normal 或 disabled 以控制“禁用”状态位。 这是一个只写选项:设置它会更改控件状态,但 Widget.state() 方法不影响此选项。 |
- 控件状态
控件状态由独立的状态标志组成的位图:
参数 | 描述 |
---|---|
active | 鼠标光标在小部件上,按下鼠标按钮会导致一些动作发生。 |
disabled | 在程序控制下,控件被禁用 |
focus | 焦点 |
pressed | 控件被按下 |
selected | On 、true 或 current 用于诸如 Checkbuttons 和 radiobuttons 之类的东西 |
background | Windows和Mac有一个“active”或前景窗口的概念。背景状态在后台窗口中为控件设置,并在前台窗口中清除。 |
readonly | 只读,不允许用户改动 |
alternate | 特定于窗口控件件的替代显示格式。 |
invalid | 控件的值无效。 |