Resumo : neste tutorial, você aprenderá sobre os elementos ttk e como eles são montados em estilos de widgets.
Introdução aos elementos ttk
Até agora, você aprendeu que um tema é uma coleção de estilos que define a aparência de todos os widgets ttk .
Um estilo é uma descrição da aparência de uma classe de widget. Um estilo é composto por um ou mais elementos.
Por exemplo, a Label
consiste em border
e elementos. E esses elementos estão aninhados uns nos outros como na imagem a seguir:padding
label
Em geral, a maioria dos estilos ttk integrados usam o conceito de layout para organizar as diferentes camadas de elementos que constroem um widget.
Para obter o layout de uma classe de widget, você usa o layout()
método do Style
objeto assim:
style.layout(widget_class)
Linguagem de código: Python ( python )
Se uma classe de widget não tiver layout, o layout()
método gerará uma tk.TclError
exceção.
O layout()
método retorna uma lista de tuplas ( element_name
, description
), onde:
element_name
é o nome do elemento.description
é um dicionário que descreve o elemento.
O exemplo a seguir usa o layout()
método para obter o layout da TLabel
classe do widget:
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()
Linguagem de código: Python ( python )
A saída a seguir mostra o layout do estilo do TLabel
:
[('Label.border',
{'sticky': 'nswe',
'border': '1',
'children': [('Label.padding',
{'sticky': 'nswe',
'border': '1',
'children': [('Label.label',
{'sticky': 'nswe'})]
})]
}
)]
Linguagem de código: Python ( python )
O TLabel
tem três elementos aninhados uns nos outros:
- O
Label.border
é o elemento mais externo que possui as chavessticky
,border
echildren
. - O
Label.padding
está aninhado dentro doLabel.border
. Ele também possui as teclassticky
,border
echildren
. - O
Label.label
é o elemento mais interno que possui apenas umasticky
chave.
Por exemplo, quando um elemento tem uma sticky
chave com o valor nswe
, ele seria esticado para aderir ao norte, sul, oeste e leste do elemento pai.
Observe que o layout do estilo da classe de um widget depende do tema atual . Se você alterar o tema, o layout poderá ser diferente.
Opções de elemento
Cada elemento possui uma lista de opções que especificam a aparência do elemento. Para obter a lista de nomes de opções, você usa o element_options()
método do Style
objeto:
style.element_options(styleName)
Linguagem de código: Python ( python )
O programa a seguir mostra as opções de elemento dos elementos Label.border
, Label.padding
e 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()
Linguagem de código: Python ( python )
Saída:
('relief',)
('padding', 'relief', 'shiftrelief')
('compound', 'space', 'text', 'font', 'foreground', 'underline', 'width', 'anchor', 'justify', 'wraplength', 'embossed', 'image', 'stipple', 'background')
Linguagem de código: Python ( python )
Nesta saída:
- O
Label.border
elemento tem uma opção:'relief'
. - O
Label.padding
elemento tem três opções:'padding'
,'relief'
, e'shiftrelief'
. - O
Label.label
elemento tem muitas opções, incluindo'font'
,'foreground'
,'with'
, etc.
Atributos de opções de elemento
Para obter uma lista de atributos associados a uma opção de elemento, você usa o lookup()
método do Style
objeto:
style.lookup(layout_name, option_name)
Linguagem de código: Python ( python )
O exemplo a seguir mostra os atributos das opções font
, foreground
e background
no TLabel.label
elemento:
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()
Linguagem de código: Python ( python )
Saída:
TkDefaultFont
SystemWindowText
SystemButtonFace
Linguagem de código: Python ( python )
Como você pode ver claramente na saída, font
is TkDefaultFont
, foreground
is SystemWindowText
e background
is SystemButtonFace
.
Junte tudo
A seguir mostramos como alterar a aparência de um Label
widget:
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()
Linguagem de código: Python ( python )
Resumo
- Um widget ttk é composto de elementos. O
layout
determina como os elementos montaram o widget. - Use o
Style.layout()
método para recuperar o layout de uma classe de widget. - Use o
Style.element_options()
método para obter as opções de elemento de um elemento. - Use o
Style.lookup()
método para obter os atributos de uma opção de elemento.