本教程是博主个人心血,如有引用,需在文章顶部标明引用信息

​《tkinter实用教程一》Linux 环境下安装tkinter​

​《tkinter实用教程二》tkinter 子模块 ttk​

​《tkinter实用教程三》tkinter Button 控件​

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 子模块_tkinter《tkinter实用教程二》ttk 子模块_可选参数_02

从截图可以明显看出 ​​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()


以下是代码执行的结果:

《tkinter实用教程二》ttk 子模块_实用教程_03《tkinter实用教程二》ttk 子模块_tkinter_04

二者在展示效果上基本没有区别,主要区别在代码的编写上。

由于 ​​ttk​​ 分离了控件的创建代码和样式代码,所以代码看起来比较复杂,行数较多。

实际上,​​ttk​​ 由于抽离了样式代码,同样的样式只需要写一次,在创建控件的时候可以直接引用,所以当控件较多时,会极大的降低工作和代码量。

而 ​​tkinter​​ 原生控件每次创建一个控件,都需要写一遍样式代码,所以不适合使用在稍微复杂一点的应用中。

configure() 函数的参数

​ttk.Style()​​ 对象实例能够通过 ​​ttk.Style().configure()​​ 函数设置样式各选项的值。

​ttk.Style().configure()​​ 函数的第一个参数是样式的名称,​​ttk​​ 中所有的控件都默认分配了一个样式名称,例如 ​​Button​​ 组件的默认样式名称是 "TButton"。

​Label​​ 控件的默认样式名称是 "TLabel"。

所以上述 ​​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")
l1.pack()

root.mainloop()


虽然,在创建 ​​Label​​ 对象 ​​l1​​ 时,并没有指定样式名称,但是 ​​style_default​​ 同样会影响到 ​​l1​​ 的样式,因为 "TLabel" 样式是 ​​Label​​ 对象默认的样式。

代码执行结果如下图:

《tkinter实用教程二》ttk 子模块_ttk_05

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​​ 中的接口,不应该直接实例化。

  1. 所有 ​​ttk​​ 控件都能接受以下参数:

参数

描述

class

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

cursor

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

takefocus

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

style

可用于指定控件样式。

  1. 可滚动控件的通用可选参数

具备滚动条的控件支持以下可选参数:

参数

描述

xscrollcommand

用于与水平滚动条通信。当widget窗口中的视图发生变化时,widget会根据scrollcommand生成Tcl命令。通常这个选项由一些滚动条的Scrollbar.set()方法组成。 这将导致滚动条在窗口中的视图发生变化时更新。

yscrollcommand

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

  1. 标签类控件的通用参数
    ​Label​​、​​Button​​ 和 ​​类Button​​ 控件支持以下可选参数:

参数

描述

text

指定在控件中展示的字符串

textvariable

指定一个变量名,这个变量的值会填充text参数,展示在控件中。

underline

如果设置,则指定要在文本字符串中加下划线的字符的索引(从 0 开始)。 下划线字符用于助记符激活。

image

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

compound

在文本和图像选项都存在的情况下,指定如何相对于文本显示图像。 有效值为:text:仅显示文本;image:仅显示图像;top、bottom、left、right:分别显示文本的上方、下方、左侧或右侧的图像。none:默认值。 显示图像(如果存在),否则显示文本。

width

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

  1. 兼容性选项

参数

描述

state

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

  1. 控件状态

控件状态由独立的状态标志组成的位图:

参数

描述

active

鼠标光标在小部件上,按下鼠标按钮会导致一些动作发生。

disabled

在程序控制下,控件被禁用

focus

焦点

pressed

控件被按下

selected

​On​​、​​true​​或 ​​current​​ 用于诸如 Checkbuttons 和 radiobuttons 之类的东西

background

Windows和Mac有一个“active”或前景窗口的概念。背景状态在后台窗口中为控件设置,并在前台窗口中清除。

readonly

只读,不允许用户改动

alternate

特定于窗口控件件的替代显示格式。

invalid

控件的值无效。