Pacote Tkinter

Resumo : neste tutorial, você aprenderá sobre o gerenciador de geometria do pacote Tkinter e como usá-lo para organizar widgets em uma janela.

Introdução ao gerenciador de geometria do pacote Tkinter

Tkinter usa o gerenciador de geometria para organizar widgets em uma janela. Tkinter oferece suporte a três gerenciadores de geometria:

O gerenciador de geometria do pacote organiza os widgets em blocos antes de colocá-los no widget contêiner, que pode ser a janela principal ou um quadro .

O gerenciador de geometria do pacote possui muitas opções que organizam os widgets:

  • Lado
  • Expandir
  • Preencher
  • ipadx, ipady
  • padx, pady
  • Âncora

Antes de mergulhar em cada opção, você precisa entender as xcoordenadas yda janela:

O canto superior esquerdo da janela é a origem com a coordenada (0,0). A coordenada x aumenta da esquerda para a direita e a coordenada y aumenta de cima para baixo.

Parâmetros do pacote Tkinter

Criaremos um programa simples para ilustrar como funciona o gerenciador de geometria de pacotes:

import tkinter as tk

root = tk.Tk()
root.title('Tkinter Pack Layout')
root.geometry('600x400')

label1 = tk.Label(master=root, text='Tkinter',bg='red',fg='white')
label2 = tk.Label(master=root,text='Pack Layout',bg='green', fg='white')
label3 = tk.Label(master=root, text='Demo',bg='blue', fg='white')

label1.pack()
label2.pack()
label3.pack()

root.mainloop()Linguagem de código:  JavaScript  ( javascript )

O programa possui uma janela principal com três rótulos com cores de fundo vermelho, verde e azul.

Para usar o gerenciador de geometria do pacote, você chama o pack()widget. Por padrão, o gerenciador de geometria do pacote coloca os widgets em uma direção verticalmente, de cima para baixo.

Lado

O sideparâmetro determina a direção dos widgets no layout do pacote.

O sideparâmetro tem quatro opções:

  • 'top': organize os widgets de cima para baixo verticalmente.
  • 'bottom': organize os widgets de baixo para cima verticalmente.
  • 'left': organize os widgets da esquerda para a direita horizontalmente.
  • 'right': organize os widgets da direita para a esquerda horizontalmente.

O sidepadrão é 'top', organizando o widget verticalmente de cima para baixo.

Além das constantes de string, você pode usar as constantes predefinidas fornecidas pelo módulo Tkinter:

  • tk.TOP
  • tk.BOTTOM
  • tk.LEFT
  • tk.RIGHT

Observe que importamos o Tkintermódulo como tk.

O programa a seguir define explicitamente o lado 'top'que organiza os rótulos verticalmente de cima para baixo:

import tkinter as tk

root = tk.Tk()
root.title('Tkinter Pack Layout')
root.geometry('600x400')

label1 = tk.Label(master=root, text='Tkinter',bg='red',fg='white')
label2 = tk.Label(master=root,text='Pack Layout',bg='green', fg='white')
label3 = tk.Label(master=root, text='Demo',bg='blue', fg='white')

label1.pack(side=tk.TOP)
label2.pack(side=tk.TOP)
label3.pack(side=tk.TOP)

root.mainloop()Linguagem de código:  JavaScript  ( javascript )

Quando você altera o lado para tk.BOTTOM, o pacote organiza as etiquetas de baixo para cima verticalmente:

import tkinter as tk

root = tk.Tk()
root.title('Tkinter Pack Layout')
root.geometry('600x400')

label1 = tk.Label(master=root, text='Tkinter',bg='red',fg='white')
label2 = tk.Label(master=root,text='Pack Layout',bg='green', fg='white')
label3 = tk.Label(master=root, text='Demo',bg='blue', fg='white')

label1.pack(side=tk.BOTTOM)
label2.pack(side=tk.BOTTOM)
label3.pack(side=tk.BOTTOM)

root.mainloop()Linguagem de código:  JavaScript  ( javascript )

Saída:

A lateral tk.LEFTorganiza os rótulos da esquerda para a direita:

A lateral tk.RIGHTorganiza os rótulos da direita para a esquerda:

Espaços de widgets

No Tkinter, existem dois tipos de espaços:

  • O espaço que um widget pode ocupar
  • O espaço que um widget ocupará .

Por padrão, um widget ocupará apenas o espaço necessário para exibir seu conteúdo. No entanto, um widget pode ocupar mais espaço.

Por exemplo, um widget Etiqueta será tão grande quanto o texto. A cor de fundo mostra que cada etiqueta tem uma largura diferente porque o comprimento do texto é diferente.

Expandir

A expansão determina se o widget deve ser expandido para ocupar espaços extras alocados ao contêiner.

Se a expansão estiver definida como True, o widget será expandido e, se definido como False, isso não acontecerá. O parâmetro de expansão é padronizado como False.

O parâmetro de expansão é altamente dependente do parâmetro lateral.

A tabela a seguir ilustra as dependências entre os parâmetros side e expand quando se trata do espaço do widget.

Lado Expandir
Topo ou base) O widget pode ser tão largo quanto o contêiner, a expansão determinará a altura do widget.
Esquerda ou direita) O widget pode ser tão alto quanto o contêiner, a expansão determinará a largura do widget.

O programa a seguir coloca os widgets Label verticalmente de cima para baixo e define o parâmetro de expansão do primeiro widget Label como True e os outros dois widgets Label como False:

import tkinter as tk

root = tk.Tk()
root.title('Tkinter Pack Layout')
root.geometry('600x400')

label1 = tk.Label(master=root, text='Tkinter',bg='red',fg='white')
label2 = tk.Label(master=root,text='Pack Layout',bg='green', fg='white')
label3 = tk.Label(master=root, text='Demo',bg='blue', fg='white')

label1.pack(side=tk.TOP, expand=True)
label2.pack(side=tk.TOP, expand=False)
label3.pack(side=tk.TOP, expand=False)

root.mainloop()
Linguagem de código:  PHP  ( php )

Como definimos o parâmetro expand do primeiro Label como true, ele ocupa todo o espaço vertical e empurra os outros dois widgets Label para baixo:

O programa a seguir coloca os widgets Label horizontalmente da esquerda para a direita e define o parâmetro de expansão do primeiro widget Label como True e os outros dois widgets Label como False:

import tkinter as tk

root = tk.Tk()
root.title('Tkinter Pack Layout')
root.geometry('600x400')

label1 = tk.Label(master=root, text='Tkinter',bg='red',fg='white')
label2 = tk.Label(master=root,text='Pack Layout',bg='green', fg='white')
label3 = tk.Label(master=root, text='Demo',bg='blue', fg='white')

label1.pack(side=tk.LEFT, expand=True)
label2.pack(side=tk.LEFT, expand=False)
label3.pack(side=tk.LEFT, expand=False)

root.mainloop()Linguagem de código:  PHP  ( php )

Como definimos o parâmetro expand do primeiro Label como true, ele ocupa o espaço totalmente horizontal e empurra os outros dois widgets Label para a direita:

lado esquerdo do layout do pacote tkinter, expanda verdadeiro

Se você definir o parâmetro de expansão dos três widgets Label como True, eles ocuparão espaços horizontais uniformes:

import tkinter as tk

root = tk.Tk()
root.title('Tkinter Pack Layout')
root.geometry('600x400')

label1 = tk.Label(master=root, text='Tkinter',bg='red',fg='white')
label2 = tk.Label(master=root,text='Pack Layout',bg='green', fg='white')
label3 = tk.Label(master=root, text='Demo',bg='blue', fg='white')

label1.pack(side=tk.LEFT, expand=True)
label2.pack(side=tk.LEFT, expand=True)
label3.pack(side=tk.LEFT, expand=True)

root.mainloop()
Linguagem de código:  PHP  ( php )

Saída:

Preencher

O preenchimento determina se um widget ocupará o espaço disponível. Aceita os seguintes valores: ‘x’, ‘y’, ‘ambos’ e ‘nenhum’. Por padrão, o preenchimento é ‘nenhum’.

preencher Efeito
‘nenhum’ O widget não se expandirá para preencher nenhum espaço extra. Ocupa apenas espaço adequado ao conteúdo.
‘x’ O widget se expandirá horizontalmente para preencher qualquer espaço extra ao longo do eixo x.
‘você’ O widget se expandirá verticalmente para preencher qualquer espaço extra ao longo do eixo y.
‘ambos’ O widget se expandirá horizontal e verticalmente para preencher qualquer espaço extra em ambas as direções.

O programa a seguir ilustra como funciona o parâmetro fill:

import tkinter as tk

root = tk.Tk()
root.title('Tkinter Pack Layout')
root.geometry('600x400')

label1 = tk.Label(master=root, text='Tkinter',bg='red',fg='white')
label2 = tk.Label(master=root,text='Pack Layout',bg='green', fg='white')
label3 = tk.Label(master=root, text='Fill',bg='blue', fg='white')
label4 = tk.Label(master=root, text='Demo',bg='purple', fg='white')

label1.pack(side=tk.TOP, expand=True, fill=tk.X)
label2.pack(side=tk.TOP, expand=True, fill=tk.Y)
label3.pack(side=tk.TOP, expand=True, fill=tk.NONE)
label4.pack(side=tk.TOP, expand=True, fill=tk.BOTH)


root.mainloop()
Linguagem de código:  PHP  ( php )

Saída:

demonstração de preenchimento do pacote tkinter

Neste exemplo, organizamos os widgets Label verticalmente, de cima para baixo. As expansões de todos os widgets Label são definidas como True.

  • O primeiro widget Label tem o valor de preenchimento tk.X, permitindo preencher espaços extras ao longo do eixo x.
  • O segundo widget Label tem o valor de preenchimento tk.Y, permitindo preencher espaços extras ao longo do eixo y.
  • O terceiro widget Label tem o valor de preenchimento tk.NONE, indicando que ele não se expande para preencher nenhum espaço extra.
  • O quarto widget Label tem o valor de preenchimento tk.BOTH, permitindo que ele ocupe qualquer espaço adicional nas direções horizontal e vertical.

Preenchimentos internos: ipadx e ipady

Os parâmetros ipadxe ipadycriam preenchimentos internos para widgets:

  • ipadxcria preenchimento à esquerda e à direita ou preenchimento ao longo do eixo x.
  • ipadycria preenchimento superior e inferior ou preenchimento ao longo do eixo y.

Por exemplo, o programa a seguir usa parâmetros ipadxe ipadypara definir os preenchimentos internos de cada widget Label:

import tkinter as tk

root = tk.Tk()
root.title('Tkinter Pack Layout')
root.geometry('600x400')

label1 = tk.Label(master=root, text='Pack',bg='red',fg='white')
label2 = tk.Label(master=root,text='Pack',bg='green', fg='white')
label3 = tk.Label(master=root, text='Pack',bg='blue', fg='white')
label4 = tk.Label(master=root, text='Pack',bg='purple', fg='white')

label1.pack(side=tk.LEFT)
label2.pack(side=tk.LEFT, ipadx=40)
label3.pack(side=tk.LEFT, ipady=40)
label4.pack(side=tk.LEFT, ipadx=80, ipady=80)

root.mainloop()Linguagem de código:  Python  ( python )

Saída:

pacote tkinter ipadx ipady

Preenchimentos externos: padx e pady

Os parâmetros padxe padypermitem especificar o preenchimento a ser adicionado horizontal e verticalmente, respectivamente:

  • padx– representa o preenchimento horizontal que adiciona espaço à esquerda e à direita do widget.
  • pady– representa o preenchimento vertical que adiciona espaço acima ou abaixo do widget.

O exemplo a seguir ilustra como usar o pady:

import tkinter as tk

root = tk.Tk()
root.title('Tkinter Pack Layout')
root.geometry('600x400')

label1 = tk.Label(master=root, text='Pack',bg='red',fg='white')
label2 = tk.Label(master=root,text='Pack',bg='green', fg='white')
label3 = tk.Label(master=root, text='Pack',bg='blue', fg='white')
label4 = tk.Label(master=root, text='Pack',bg='purple', fg='white')

label1.pack(side=tk.TOP, fill=tk.X, pady=10)
label2.pack(side=tk.TOP, fill=tk.X, pady=20)
label3.pack(side=tk.TOP, fill=tk.X ,pady=40)
label4.pack(side=tk.TOP, fill=tk.X, pady=60)

root.mainloop()Linguagem de código:  JavaScript  ( javascript )

Saída:

O programa a seguir ilustra como usar o padx:

import tkinter as tk

root = tk.Tk()
root.title('Tkinter Pack Layout')
root.geometry('600x400')

label1 = tk.Label(master=root, text='Pack',bg='red',fg='white')
label2 = tk.Label(master=root,text='Pack',bg='green', fg='white')
label3 = tk.Label(master=root, text='Pack',bg='blue', fg='white')
label4 = tk.Label(master=root, text='Pack',bg='purple', fg='white')

label1.pack(side=tk.LEFT, fill=tk.X, padx=10)
label2.pack(side=tk.LEFT, fill=tk.X, padx=20)
label3.pack(side=tk.LEFT, fill=tk.X ,padx=40)
label4.pack(side=tk.LEFT, fill=tk.X, padx=60)

root.mainloop()Linguagem de código:  JavaScript  ( javascript )

Saída:

pacote tkinter padx

Âncora

O anchorparâmetro permite ancorar o widget na borda do espaço alocado. Ele aceita um dos seguintes valores:

Pegajoso Descrição
‘e’ Norte ou Centro Superior
‘é’ Sul ou Centro Inferior
‘e’ Centro Leste ou Direita
‘c’ Centro Oeste ou Esquerda
‘agora’ Noroeste ou canto superior esquerdo
‘não’ Nordeste ou canto superior direito
‘se’ Sudeste ou canto inferior direito
‘sw’ Sudoeste ou canto inferior esquerdo
‘Centro’ Centro

A imagem a seguir ilustra as opções de âncora:

ilustração de âncora do pacote tkinter

Por exemplo, o programa a seguir mostra widgets que usam Eâncoras W:

import tkinter as tk

root = tk.Tk()
root.title('Pack Demo')
root.geometry("350x200")

# box 1
box1 = tk.Label(root, text="Box 1", bg="green", fg="white")
box1.pack(ipadx=20, ipady=20, anchor=tk.E,  expand=True)

# box 2
box2 = tk.Label(root, text="Box 2", bg="red", fg="white")
box2.pack(ipadx=20, ipady=20, anchor=tk.W, expand=True)


root.mainloop()Linguagem de código:  PHP  ( php )

Saída:

Usando o pacote Tkinter para criar um formulário de login

O exemplo a seguir usa o método pack() para criar um formulário de login:

import tkinter as tk
from tkinter import ttk

root = tk.Tk()
root.title('Login')
root.geometry("350x220")


fields = {}

fields['username_label'] = ttk.Label(text='Username:')
fields['username'] = ttk.Entry()

fields['password_label'] = ttk.Label(text='Password:')
fields['password'] = ttk.Entry(show="*")


for field in fields.values():
    field.pack(anchor=tk.W, padx=10, pady=5, fill=tk.X)

ttk.Button(text='Login').pack(anchor=tk.W, padx=10, pady=5)

root.mainloop()
Linguagem de código:  JavaScript  ( javascript )

Saída:

Como funciona.

Primeiro, inicialize um dicionário para armazenar os widgets:

fields = {}

Em segundo lugar, crie widgets de rótulo e entrada:

fields['username_label'] = ttk.Label(text='Username:')
fields['username'] = ttk.Entry()

fields['password_label'] = ttk.Label(text='Password:')
fields['password'] = ttk.Entry(show="*")Linguagem de código:  JavaScript  ( javascript )

Terceiro, percorra os widgets e empacote-os:

for field in fields.values():
    field.pack(anchor=tk.W, padx=10, pady=5, fill=tk.X)

Por fim, adicione o botão de login:

ttk.Button(text='Login').pack(anchor=tk.W, padx=10, pady=5)Linguagem de código:  JavaScript  ( javascript )

Resumo

  • Use o gerenciador de geometria do pacote Tkinter para organizar os widgets em um layout de cima para baixo ou lado a lado.
  • Use as opções de lateral, expansão e preenchimento do gerenciador de geometria de pacote para controlar como os widgets são organizados.

Deixe um comentário

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