Как изменить тему виджета 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) изменится на следующий: