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

2024-05-11 17:30:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近做了一些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样式,如果有,有多少种,在哪里可以查到


Tags: fromimport信息styletkintergui教程root
3条回答

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

主题层的目的是使Tk更好地适应用户桌面的本机外观,而不是允许程序员创建各种外观糟糕的自定义小部件。传统知识已经做到了这一点。

所以在Windows上,默认的主题是可以使用Visual Styles API的主题。这就是在Windows XP和up上绘制按钮边缘和背景等的方法。由于Tk在创建时支持旧版本的Windows,因此我们还有一个支持GDI绘图元素(winnive)的主题。对于运行在MacOS上的Tk,有一个元素引擎使用原生主题,而在X11上,我们必须使用Tk绘图来发布看起来正常的东西。试图让Ttk钩住GTK+和Qt主题api的尝试并没有真正成功。

所以你可用的主题取决于你所处的平台。不同的主题提供了不同数量的可配置性。那些使用外部API(vsapi、winnive或aqua)提供的元素的用户并不能真正让您进行大量定制。但是,主题也可以从默认(Tk绘制)元素引擎导入元素,或者使用images作为可视元素。如果您真的想的话,image元素引擎允许您完全改变整个样式集合的外观(从而改变所有小部件的外观)。但是它相当缓慢。

一般来说,重点是减少开发人员的工作,使应用程序看起来像本机的,而不允许最终的可定制性。

要查找可用的主题:

>>> ttk.Style().theme_names()
('clam', 'alt', 'default', 'classic')

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

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

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

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的现有样式,然后更改您在配置调用中指定的内容)

所以用这种样式创建的任何按钮看起来都一样。

相关问题 更多 >