Ink*_*lot 7 python themes tkinter widget ttk
我最近一直在制作一些GUI,发现按钮看起来很平淡,所以我读了一些关于使用ttk使外观变得更好的教程,并得到以下内容:
from tkinter import ttk
from tkinter.ttk import *
root = tkinter.Tk()
style = ttk.Style()
style.configure("BW.TLabel")
btn = ttk.Button(text="Test")
btn.pack()
root.mainloop()
Run Code Online (Sandbox Code Playgroud)
是的它看起来更好,但我想知道是否有不同的ttk样式,如果是这样,有多少样式,在哪里检查它们
首先,一些术语。Ttk 是 Tk 的主题层。它由一组主题组成,这些主题由应用于小部件的样式组成。样式由一个或多个元素引擎提供的元素组成。
主题层的目的是让 Tk 更好地适应用户桌面的原生外观和感觉,而不是允许程序员创建各种看起来很糟糕的自定义小部件。这已经通过 Tk 实现了。
因此,在 Windows 上,默认主题是可以使用 Visual Styles API 的主题。这就是在 Windows XP 及更高版本上绘制按钮边缘和背景等的东西。由于 Tk 在创建时支持旧版本的 Windows,我们还有一个支持 GDI 绘图元素(winnative)的主题。对于在 MacOS 上运行的 Tk,有一个使用本机主题的元素引擎,而在 X11 上,我们必须使用 Tk 绘图来发布一些看起来不错的东西。将 Ttk 挂钩到 GTK+ 和 Qt 主题 API 的尝试未能真正起飞。
因此,您可用的主题取决于您所在的平台。不同的主题提供不同数量的可配置性。那些使用由外部 API(vsapi、winnative 或 aqua)提供的元素并不能真正让您自定义太多。但是,主题也可以从默认(Tk 绘制)元素引擎导入元素或使用图像作为视觉元素。如果您真的愿意,图像元素引擎允许您完全更改整个样式集合的外观(以及所有小部件的外观)。然而它相当慢。
总的来说,重点是减少开发人员的工作,使应用程序看起来是原生的,而不是允许最终的可定制性。
要查找可用的主题:
>>> ttk.Style().theme_names()
('clam', 'alt', 'default', 'classic')
Run Code Online (Sandbox Code Playgroud)
这是在 Linux 上。在 Windows 7 上也会有 winnative、xpnative 和 vista。除非应用程序选择替代主题,否则在运行时根据平台选择初始主题。
主题中定义的样式都链接到小部件。没有提供枚举所有样式的方法。您可以遍历所有 ttk 小部件并查看它们的winfo_class()
方法结果,因为这显示了该小部件使用的主题样式。
ttk 没有那么多内置样式,我相信每种类型的小部件只有一种样式。ttk 允许您做的是定义从内置函数派生的自己的样式,调整您想要不同的位,然后轻松将该样式应用于所有小部件。
这是一个很好的参考。但假设您想更改所有 ttk 按钮,使它们使用红色字体,您将执行以下操作:
import tkinter as tk
from tkinter import ttk
from tkinter.ttk import *
root = tk.Tk()
style = ttk.Style()
style.configure("TButton", foreground="red")
btn = ttk.Button(text="Test")
btn.pack()
root.mainloop()
Run Code Online (Sandbox Code Playgroud)
那么每个 ttk 按钮都会被设置为红色前景。
要创建新样式,您可以这样做:
import tkinter as tk
from tkinter import ttk
from tkinter.ttk import *
root = tk.Tk()
style = ttk.Style()
style.configure("Mine.TButton", foreground="red")
btn = ttk.Button(text="Test")
btn.pack()
btn2 = ttk.Button(text="Test", style="Mine.TButton")
btn2.pack()
root.mainloop()
Run Code Online (Sandbox Code Playgroud)
所以第一个按钮使用默认按钮样式,但我正在派生一个名为 Mine.TButton 的新按钮样式(.TButton 意味着它复制 TButton 的现有样式,然后更改您在配置调用中指定的内容)
因此使用该样式创建的任何按钮看起来都是一样的。