Tkinter 主题
当前的 Tk 组件主题功能是新组件集最强大和令人兴奋的功能之一。但是,这也是最令人困惑的事情之一。
本教程演示了主题的样式,它控制了组件在 Tkinter GUI 中的外观。换句话说,我们可以说按钮外观和其他组件应该是什么样子。
Tkinter GUI 中的主题
这是一组样式,用于定义 GUI 中的每个组件的外观。主题修改增强了 GUI 外观,与普通的 Tkinter GUI 外观不同。
然而,在它被删除之前,很少有应用程序会从可能不同的运动、游戏或教育计划等不断变化的主题中受益。
不同平台的主题可能不同,尤其是 macOS 和 Windows。Tkinter 允许你将当前主题更改为另一个主题。
如果你将当前主题更改为新主题,Tkinter 会将样式应用于所有 ttk 组件。我们需要创建一个 ttk.Style 类的实例来获取主题。
style = ttk.Style(window)
Style
帮助用户避免冗余和重复的代码。
如果你的应用中有 20 个按钮组件,则创建一个 style 对象,那么你无需在创建组件时重复外观细节。这样,组件看起来很时尚。
由于 style 将有关外观的所有信息收集在一个位置,因此其他组件的按钮样式和样式可以共享共同特征,从而提高一致性和重用性。
我们需要使用 theme_use() 方法获取可用主题并打印可用主题。
print(style.theme_names())
输出结果:
('winnative', 'clam', 'alt', 'default', 'classic', 'vista', 'xpnative')
如果我们需要获取当前主题,我们可以使用 theme_use()
方法来使用它。
style.theme_use()
我们可以使用 selected_theme
类选择其他主题来使用不同的主题; get()
方法将有助于获得该主题。
style.theme_use(window.selected_theme.get())
我们在这个循环中生成了多个 Radiobutton
,它们存储主题名称并在每次迭代时获取单独的值。
for theme_name in style.theme_names():
# Create a bulk of radio buttons using loop
radio_buttons = ttk.Radiobutton(
theme_frame,
text=theme_name,
value=theme_name,
variable=window.selected_theme,
command=theme_changer)
radio_buttons.pack(expand=True, fill='both')
command 选项持有 theme_changer
函数以在用户选择单选按钮时调用。
此函数将使用 e 在 Radiobutton 组件选项中传递的 StringVar() 类更改主题。
def theme_changer():
# Change theme
style.theme_use(window.selected_theme.get())
完整源代码:
from tkinter import *
from tkinter import ttk
# Create GUI window
window=Tk()
window.title('Delftstack')
window.geometry('500x400')
# create style object
style = ttk.Style(window)
def theme_changer():
# Change theme
style.theme_use(window.selected_theme.get())
label = ttk.Label(window, text='Name:')
label.grid(column=0, row=0, padx=10, pady=10, sticky='w')
entry = ttk.Entry(window)
entry.grid(column=1, row=0, padx=10, pady=10, sticky='w')
button = ttk.Button(window, text='press')
button.grid(column=2, row=0, padx=10, pady=10, sticky='w')
window.selected_theme = StringVar()
theme_frame = ttk.LabelFrame(window, text='Themes')
theme_frame.grid(padx=10, pady=10, ipadx=20, ipady=20, sticky='w')
for theme_name in style.theme_names():
# Create a bulk of radio buttons using loop
radio_buttons = ttk.Radiobutton(
theme_frame,
text=theme_name,
value=theme_name,
variable=window.selected_theme,
command=theme_changer)
radio_buttons.pack(expand=True, fill='both')
window.mainloop()
print(style.theme_names())
输出结果: