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 x
coordenadas y
da 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 side
parâmetro determina a direção dos widgets no layout do pacote.
O side
parâ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 side
padrã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 Tkinter
mó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.LEFT
organiza os rótulos da esquerda para a direita:
A lateral tk.RIGHT
organiza 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:
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:
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 ipadx
e ipady
criam preenchimentos internos para widgets:
ipadx
cria preenchimento à esquerda e à direita ou preenchimento ao longo do eixo x.ipady
cria preenchimento superior e inferior ou preenchimento ao longo do eixo y.
Por exemplo, o programa a seguir usa parâmetros ipadx
e ipady
para 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:
Preenchimentos externos: padx e pady
Os parâmetros padx
e pady
permitem 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:
Âncora
O anchor
parâ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:
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.