Resumo : neste tutorial, você aprenderá sobre os estilos ttk, como usar e personalizar os estilos do widget e como alterar a aparência de um widget estendendo os estilos integrados.
Introdução aos estilos ttk
Um tema de uma coleção de estilos que determinam a aparência dos widgets ttk .
Um estilo é uma descrição da aparência de uma classe de widget. Normalmente, um tema vem com um conjunto predefinido de estilos.
Portanto, para alterar a aparência dos widgets ttk, você pode:
- Modifique os estilos integrados
- Crie novos estilos
Geralmente, o nome do estilo de um widget ttk começa com a letra 'T'
seguida pelo nome do widget, por exemplo, TLabel
e TButton
.
No Tkinter, cada widget possui uma classe de widget padrão. Uma classe de widget define o estilo padrão de um widget.
A tabela a seguir mostra os nomes de estilo das classes comuns de widget ttk:
Classe de widget | Nome do estilo |
---|---|
Button |
TButton |
Checkbutton |
TCheckbutton |
Combobox |
TCombobox |
Entry |
TEntry |
Frame |
TFrame |
Label |
TLabel |
LabelFrame |
TLabelFrame |
Menubutton |
TMenubutton |
Notebook |
TNotebook |
PanedWindow |
TPanedwindow |
Progressbar * |
Horizontal.TProgressbar ou Vertical.TProgressbar , dependendo da orient opção. |
Radiobutton |
TRadiobutton |
Scale * |
Horizontal.TScale ou Vertical.TScale , dependendo da orient opção. |
Scrollbar * |
Horizontal.TScrollbar ou Vertical.TScrollbar , dependendo da orient opção |
Separator |
TSeparator |
Sizegrip |
TSizegrip |
Treeview * |
Treeview |
(*) Os nomes dos estilos dos widgets Progressbar
, Scale
, Scrollbar
e Treeview
não começam com a letra T
.
Em tempo de execução, você pode obter a classe de widget chamando o winfo_class()
método da instância do widget.
O exemplo a seguir usa o winfo_class()
método para obter a classe de widget de um widget de botão:
button = ttk.Button(root, text='Click Me')
print(button.winfo_class())
Linguagem de código: Python ( python )
Saída:
TButton
Linguagem de código: Python ( python )
Modificando estilos ttk integrados
Cada estilo possui um conjunto de opções que definem a aparência do widget.
Para modificar a aparência de um estilo, você usa o configure()
método da Style
classe:
style = ttk.Style(root)
style.configure(style_name, **options)
Linguagem de código: Python ( python )
O programa a seguir mostra como alterar a fonte de todos os Label
widgets Button
e modificando os estilos do TLabel
e :TButton
import tkinter as tk
from tkinter import ttk
class App(tk.Tk):
def __init__(self):
super().__init__()
self.geometry('300x110')
self.resizable(0, 0)
self.title('Login')
# UI options
paddings = {'padx': 5, 'pady': 5}
entry_font = {'font': ('Helvetica', 11)}
# configure the grid
self.columnconfigure(0, weight=1)
self.columnconfigure(1, weight=3)
username = tk.StringVar()
password = tk.StringVar()
# username
username_label = ttk.Label(self, text="Username:")
username_label.grid(column=0, row=0, sticky=tk.W, **paddings)
username_entry = ttk.Entry(self, textvariable=username, **entry_font)
username_entry.grid(column=1, row=0, sticky=tk.E, **paddings)
# password
password_label = ttk.Label(self, text="Password:")
password_label.grid(column=0, row=1, sticky=tk.W, **paddings)
password_entry = ttk.Entry(
self, textvariable=password, show="*", **entry_font)
password_entry.grid(column=1, row=1, sticky=tk.E, **paddings)
# login button
login_button = ttk.Button(self, text="Login")
login_button.grid(column=1, row=3, sticky=tk.E, **paddings)
# configure style
self.style = ttk.Style(self)
self.style.configure('TLabel', font=('Helvetica', 11))
self.style.configure('TButton', font=('Helvetica', 11))
if __name__ == "__main__":
app = App()
app.mainloop()
Linguagem de código: Python ( python )
Saída:
Como funciona.
Primeiro, crie uma nova instância da classe ttk.Style:
self.style = ttk.Style(self)
Linguagem de código: Python ( python )
Segundo, altere a fonte dos estilos TLabel
e TButton
usando o configure()
método do Style
objeto:
self.style.configure('TLabel', font=('Helvetica', 12))
self.style.configure('TButton', font=('Helvetica', 12))
Linguagem de código: Python ( python )
Estendendo estilos ttk integrados
Para criar um novo estilo derivado de um estilo integrado, use o nome do estilo assim:
new_style.builtin_style
Linguagem de código: Python ( python )
Por exemplo, para criar um novo estilo de Label
widget usado para exibir um título, você pode nomeá-lo da seguinte forma:
Heading.TLabel
Linguagem de código: Python ( python )
O Heading.TLabel
estilo herda todas as opções do estilo integrado TLabel
.
Para substituir uma opção específica, você também usa o configure()
método da Style
classe:
style = ttk.Style(self)
style.configure(custom_style, **options)
Linguagem de código: Python ( python )
O exemplo a seguir adiciona um cabeçalho à janela de login. O título tem o estilo derivado do TLabel
estilo:
import tkinter as tk
from tkinter import ttk
class App(tk.Tk):
def __init__(self):
super().__init__()
self.geometry('300x150')
self.resizable(0, 0)
self.title('Login')
# UI options
paddings = {'padx': 5, 'pady': 5}
entry_font = {'font': ('Helvetica', 11)}
# configure the grid
self.columnconfigure(0, weight=1)
self.columnconfigure(1, weight=3)
username = tk.StringVar()
password = tk.StringVar()
# heading
heading = ttk.Label(self, text='Member Login', style='Heading.TLabel')
heading.grid(column=0, row=0, columnspan=2, pady=5, sticky=tk.N)
# username
username_label = ttk.Label(self, text="Username:")
username_label.grid(column=0, row=1, sticky=tk.W, **paddings)
username_entry = ttk.Entry(self, textvariable=username, **entry_font)
username_entry.grid(column=1, row=1, sticky=tk.E, **paddings)
# password
password_label = ttk.Label(self, text="Password:")
password_label.grid(column=0, row=2, sticky=tk.W, **paddings)
password_entry = ttk.Entry(
self, textvariable=password, show="*", **entry_font)
password_entry.grid(column=1, row=2, sticky=tk.E, **paddings)
# login button
login_button = ttk.Button(self, text="Login")
login_button.grid(column=1, row=3, sticky=tk.E, **paddings)
# configure style
self.style = ttk.Style(self)
self.style.configure('TLabel', font=('Helvetica', 11))
self.style.configure('TButton', font=('Helvetica', 11))
# heading style
self.style.configure('Heading.TLabel', font=('Helvetica', 12))
if __name__ == "__main__":
app = App()
app.mainloop()
Linguagem de código: Python ( python )
Saída:
Como funciona.
Primeiro, adicione um título à janela e atribua o estilo Heading.TLabel
à style
opção do Label
widget:
heading = ttk.Label(self, text='Member Login', style='Heading.TLabel')
Linguagem de código: Python ( python )
Em seguida, altere a fonte do Heading.TLabel
estilo para Helvetica, 12 pixels:
self.style.configure('Heading.TLabel', font=('Helvetica', 12))
Linguagem de código: Python ( python )
Hierarquias de estilos
É possível criar suas próprias hierarquias de estilos. Por exemplo, você pode ter um Message.TLabel
estilo que herda do estilo integrado TLabel
.
E então você pode criar estilos que herdam do Message.TLabel
estilo como Error.Message.TLabel
, Warning.Message.TLabel
e Information.Message.TLabel
.
Quando você usa um estilo específico, por exemplo, Error.Message.TLabel
, ttk
procura primeiro as opções no Error.Message.TLabel
estilo. Se não encontrar as opções, ele pesquisará no Message.TLabel
estilo. E continua buscando as opções no TLabel
estilo.
A imagem a seguir ilustra o exemplo da hierarquia de estilos:
O estilo raiz determina a aparência de todos os widgets. O nome do estilo raiz'.'
é .
Por exemplo, se quiser alterar o texto para uma fonte Helvetica de 12 pixels para todos os widgets, você pode configurá-lo da seguinte maneira:
style = ttk.Style(root)
style.configure('.', font=('Helvetica', 12))
Linguagem de código: Python ( python )
Resumo
- Um tema de uma coleção de estilos. Um estilo é uma descrição da aparência de um widget.
- Use o
widget.winfo_class()
método para obter a classe de widget de um widget. A classe do widget define o estilo padrão do widget. - Use o
style.configure()
método para modificar o estilo do widget. - Para personalizar o estilo integrado, você pode estendê-lo usando o nome do estilo
new_style.builtin_style
.