Как изменить тему виджета Tkinter в Python с одной на другую

Рассмотрим, как изменить тему Tkinter с одной на другую в Python.

Темы Tkinter

В Tkinter тема определяет «look & feel» всех виджетов. Это коллекция стилей для всех виджетов ttk.

Стиль определяет внешний вид класса виджета, например, Button. Каждая тема поставляется с набором стилей. Изменить внешний вид виджетов можно следующим образом:

  • Изменение встроенных стилей
  • Создание новых стилей

Tkinter позволяет вам изменить текущую тему на другую. Когда вы меняете текущую тему на новую, Tkinter применит стили этой темы ко всем виджетам ttk.

Чтобы получить доступные темы, используйте метод theme_names() экземпляра ttk.Style.

  • Сначала создайте новый экземпляр класса ttk.Style:
style = ttk.Style(root)
  • Во-вторых, получите доступные темы, вызвав метод theme_names():
style.theme_names()

Чтобы получить текущую тему, используйте метод theme_use():

current_theme = style.theme_use()

Обратите внимание, что каждая операционная система(ОС), например Windows, macOS и Linux, поставляется со своими собственными предопределенными темами. Если вы используете методы theme_names() и theme_use() в разных ОС, вы получите разные результаты.

Чтобы изменить текущую тему на новую, передайте имя новой темы методу theme_use():

style.theme_use(theme_name)

Следующая программа показывает все темы в вашей системе и позволяет вам менять одну тему на другую:

import tkinter as tk
from tkinter import ttk


class App(tk.Tk):
    def __init__(self):
        super().__init__()

        # root window
        self.title('Theme Demo')
        self.geometry('400x300')
        self.style = ttk.Style(self)

        # label
        label = ttk.Label(self, text='Name:')
        label.grid(column=0, row=0, padx=10, pady=10,  sticky='w')
        # entry
        textbox = ttk.Entry(self)
        textbox.grid(column=1, row=0, padx=10, pady=10,  sticky='w')
        # button
        btn = ttk.Button(self, text='Show')
        btn.grid(column=2, row=0, padx=10, pady=10,  sticky='w')

        # radio button
        self.selected_theme = tk.StringVar()
        theme_frame = ttk.LabelFrame(self, text='Themes')
        theme_frame.grid(padx=10, pady=10, ipadx=20, ipady=20, sticky='w')

        for theme_name in self.style.theme_names():
            rb = ttk.Radiobutton(
                theme_frame,
                text=theme_name,
                value=theme_name,
                variable=self.selected_theme,
                command=self.change_theme)
            rb.pack(expand=True, fill='both')

    def change_theme(self):
        self.style.theme_use(self.selected_theme.get())


if __name__ == "__main__":
    app = App()
    app.mainloop()

В этом примере при выборе темы из списка переключателей метод change_theme() применит выбранную тему.

Если вы запустите программу в Windows 10, вы увидите следующее окно:

Пример выбора темы из списка переключателей

Если вы измените тему на классическую, вы увидите, что стиль виджетов (Label, Entry, Button, LabelFrame и Radio Button) изменится на следующий:

Стиль виджетов

Похожие посты
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *