Tkinter 主题

Salman Mehmood 2022年5月17日
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 函数以在用户选择单选按钮时调用。

此函数将使用 eRadiobutton 组件选项中传递的 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())

输出:

在 Tkinter GUI 中选择一个主题

点击这里阅读更多关于 Tkinter 主题的信息。

Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn