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

时间:2015-10-25 18:30:37

标签: python tkinter widget themes 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()

是的,它看起来更好,但我想知道是否有不同的ttk样式,如果有,有多少在那里以及在哪里检查它们

3 个答案:

答案 0 :(得分:3)

首先,一些术语。 Ttk是Tk的主题层。它由一组主题组成,这些主题由应用于小部件的样式组成。样式由一个或多个元素引擎提供的元素组成。

主题层的目的是使Tk更好地适应用户桌面的原生外观,而不是允许程序员创建各种可怕的自定义小部件。这已经由Tk实现。

因此在Windows上,默认主题是可以使用Visual Styles API的主题。这是在Windows XP及更高版本上绘制按钮边缘和背景等的东西。由于Tk在创建Windows时支持旧版本的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。除非应用程序选择备用主题,否则将在运行时根据平台选择初始主题。

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

答案 1 :(得分:2)

ttk没有很多内置样式,我相信每种类型的小部件只有一种风格。 ttk允许你做的是定义自己的内部派生样式,调整你想要的不同的部分,然后轻松地将这种样式应用到所有的小部件。

This是一个很好的参考。但是比如说你想改变所有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 :(得分:1)

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