Основное руководство по элементам Ttk в Python
В этом уроке вы узнаете об элементах ttk и о том, как они собираются в стилизуемые виджеты в Python.
Что такое элементы ttk
До сих пор вы знали, что тема — это набор стилей, определяющий внешний вид всех виджетов ttk. Стиль — это описание внешнего вида класса виджета. Стиль состоит из одного или нескольких элементов.
Например, Label состоит из элементов border, padding и label. И эти элементы вложены друг в друга, как показано на следующем рисунке:
В целом, большинство встроенных стилей ttk используют концепцию макета для организации различных слоев элементов, из которых состоит виджет.
Чтобы получить макет класса виджета, используйте метод layout() объекта Style следующим образом:
style.layout(widget_class)
Если класс виджета не имеет макета, метод layout() вызовет исключение tk.TclError.
Метод layout() возвращает список кортежей (element_name, description), где:
- element_name — имя элемента.
- description — это словарь, описывающий элемент.
В следующем примере метод layout() используется для получения макета класса виджета TLabel:
import tkinter as tk from tkinter import ttk class App(tk.Tk): def __init__(self): super().__init__() style = ttk.Style(self) layout = style.layout('TLabel') print(layout) if __name__ == "__main__": app = App() app.mainloop()
Следующий вывод показывает макет стиля TLabel:
[('Label.border', {'sticky': 'nswe', 'border': '1', 'children': [('Label.padding', {'sticky': 'nswe', 'border': '1', 'children': [('Label.label', {'sticky': 'nswe'})] })] } )]
TLabel состоит из трех элементов, вложенных друг в друга:
- Label.border — это самый внешний элемент, имеющий ключи sticky, border и children.
- Label.padding вложен в Label.border. Он также имеет ключи sticky, border и children.
- Label.label — это самый внутренний элемент, имеющий только одну залипающую клавишу.
Например, если элемент имеет ключ sticky со значением nswe, он будет растянут, чтобы прикрепиться к северу, югу, западу и востоку от родительского элемента.
Обратите внимание, что макет стиля класса виджета зависит от текущей темы. Если вы измените тему, макет может быть другим.
Параметры элемента
Каждый элемент имеет список опций, которые определяют внешний вид элемента. Чтобы получить список названий опций, используйте метод element_options() объекта Style:
style.element_options(styleName)
Следующая программа показывает параметры элементов Label.border, Label.padding и Label.label:
import tkinter as tk from tkinter import ttk class App(tk.Tk): def __init__(self): super().__init__() style = ttk.Style(self) # layout layout = style.layout('TLabel') print(layout) # element options print(style.element_options('Label.border')) print(style.element_options('Label.padding')) print(style.element_options('Label.label')) if __name__ == "__main__": app = App() app.mainloop()
Выход:
('relief',) ('padding', 'relief', 'shiftrelief') ('compound', 'space', 'text', 'font', 'foreground', 'underline', 'width', 'anchor', 'justify', 'wraplength', 'embossed', 'image', 'stipple', 'background')
В этом выводе:
- Элемент Label.border имеет одну опцию: «relief».
- Элемент Label.padding имеет три параметра: «padding», «relief» и «shiftrelief».
- Элемент Label.label имеет множество параметров, включая «font», «foreground», «with» и т. д.
Атрибуты опций элемента
Чтобы получить список атрибутов, связанных с параметром элемента, используйте метод lookup() объекта Style:
style.lookup(layout_name, option_name)
В следующем примере показаны атрибуты параметров font, foreground и background в элементе TLabel.label:
import tkinter as tk from tkinter import ttk class App(tk.Tk): def __init__(self): super().__init__() style = ttk.Style(self) # attributes of the font, foreground, and background # of the Label.label element print(style.lookup('Label.label', 'font')) print(style.lookup('Label.label', 'foreground')) print(style.lookup('Label.label', 'background')) if __name__ == "__main__": app = App() app.mainloop()
Выход:
TkDefaultFont SystemWindowText SystemButtonFace
Как вы можете ясно видеть из вывода, font — TkDefaultFont, foreground — SystemWindowText, а background — SystemButtonFace.
Полный код
Ниже показано, как изменить внешний вид виджета Label:
import tkinter as tk from tkinter import ttk class App(tk.Tk): def __init__(self): super().__init__() self.geometry('500x100') message = 'This is an error message!' label = ttk.Label(self, text=message, style='Error.TLabel') label.pack(expand=True) style = ttk.Style(self) style.configure('Error.TLabel', foreground='white') style.configure('Error.TLabel', background='red') style.configure('Error.TLabel', font=('Helvetica', 12)) style.configure('Error.TLabel', padding=(10, 10)) if __name__ == "__main__": app = App() app.mainloop()