Estilos Ttk

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, TLabele 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, Scrollbare Treeviewnã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:

TButtonLinguagem 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 Styleclasse:

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 Labelwidgets Buttone modificando os estilos do TLabele :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 TLabele TButtonusando o configure()método do Styleobjeto:

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_styleLinguagem de código:  Python  ( python )

Por exemplo, para criar um novo estilo de Labelwidget usado para exibir um título, você pode nomeá-lo da seguinte forma:

Heading.TLabelLinguagem de código:  Python  ( python )

O Heading.TLabelestilo 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 Styleclasse:

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 TLabelestilo:

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à styleopção do Labelwidget:

heading = ttk.Label(self, text='Member Login', style='Heading.TLabel')Linguagem de código:  Python  ( python )

Em seguida, altere a fonte do Heading.TLabelestilo 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.TLabelestilo que herda do estilo integrado TLabel.

E então você pode criar estilos que herdam do Message.TLabelestilo como Error.Message.TLabel, Warning.Message.TLabele Information.Message.TLabel.

Quando você usa um estilo específico, por exemplo, Error.Message.TLabel, ttkprocura primeiro as opções no Error.Message.TLabelestilo. Se não encontrar as opções, ele pesquisará no Message.TLabelestilo. E continua buscando as opções no TLabelestilo.

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.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *