有多少种/有哪些不同类型的ttk样式可用?

9

最近我在制作一些图形用户界面(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()

是的,看起来更好了,但我想知道是否有不同的ttk样式,如果有,有多少种,并在哪里查找它们。

3个回答

8
首先,一些术语。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绘制)元素引擎导入元素或使用images作为视觉元素。图像元素引擎允许您完全更改整个样式集的外观(因此更改所有小部件的外观),如果您真的想要的话。但它相当缓慢。
总的来说,重点是减少开发人员的工作量,使应用程序看起来本地化,而不是允许最终的可定制性。
要查找可用的主题:
>>> ttk.Style().theme_names()
('clam', 'alt', 'default', 'classic')

这是在Linux上。在Windows 7上也有winnative、xpnative和vista主题。初始主题根据平台在运行时选择,除非应用程序选择备选主题。

主题中定义的样式都与小部件相关联。没有提供枚举所有样式的方法。您可以可能迭代所有ttk小部件并查看它们的winfo_class()方法结果,因为这显示了该小部件正在使用的主题样式。


给定主题的源.TCL文件还将列出样式及其配置。它们应该位于Python安装路径下的./tcl/tk8.x/ttk/[theme].tcl目录中。 - Supra621
主题可以使用包进行扩展,因此仅使用文件名并不完整。所有主题都必须向ttk主题管理器注册,因此theme_names将列出所有已注册的主题。请参见Ttk_CreateTheme(https://www.tcl.tk/man/tcl8.6/TkLib/ttk_Theme.htm),而`ttk::style theme create`则是API的脚本等效项。 - patthoyts

2

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

那么每个 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()

所以第一个按钮使用默认的按钮样式,但我正在派生一个名为Mine.TButton的新按钮样式(.TButton表示它复制了TButton的现有样式,然后更改您在configure调用中指定的内容)。

因此,使用该样式创建的任何按钮将看起来相同。


2
from ttkthemes import themed_tk as tk #For set Themes
from tkinter import ttk               #ttk = themed tkinter

#Creating themed tkinter window and saving it in root variable
root = tk.ThemedTk() 

# Get a list of all themes that can be set
root.get_themes()

#Setting theme named radiance
root.set_theme("radiance")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接