Elementos Ttk

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 Labelconsiste em bordere elementos. E esses elementos estão aninhados uns nos outros como na imagem a seguir:paddinglabel

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 Styleobjeto 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.TclErrorexceçã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 TLabelclasse 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 TLabeltem três elementos aninhados uns nos outros:

  • O Label.borderé o elemento mais externo que possui as chaves sticky, bordere children.
  • O Label.paddingestá aninhado dentro do Label.border. Ele também possui as teclas sticky, bordere children.
  • O Label.labelé o elemento mais interno que possui apenas uma stickychave.

Por exemplo, quando um elemento tem uma stickychave 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 Styleobjeto:

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.paddinge 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.borderelemento tem uma opção: 'relief'.
  • O Label.paddingelemento tem três opções: 'padding', 'relief', e 'shiftrelief'.
  • O Label.labelelemento 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 Styleobjeto:

style.lookup(layout_name, option_name)Linguagem de código:  Python  ( python )

O exemplo a seguir mostra os atributos das opções font, foregrounde backgroundno TLabel.labelelemento:

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

Como você pode ver claramente na saída, fontis TkDefaultFont, foregroundis SystemWindowTexte backgroundis SystemButtonFace.

Junte tudo

A seguir mostramos como alterar a aparência de um Labelwidget:

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 layoutdetermina 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.

Deixe um comentário

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