grid
w.grid([opcao1=valor] [, opcao2=valor] ...)
O método grid() permite posicionar os componentes em colunas e linhas, um pouco como uma tabela em HTML. Uma célula é a interseção entre uma linha e uma coluna. Posicionamos um componente numa célula indicando o número da linha e o número da coluna que definem essa célula.
A numeração das linhas e das colunas começa no 0.
O tamanho da célula, isto é a sua largura e altura são determinados pelos tamanhos dos componentes da linha e da coluna e calculados pelo método grid().
O tamanho das células ajusta-se ao tamanhos dos componentes que dela fazem parte.
A largura da célula será determinada pela largura da célula com o componente mais largo na coluna.
A altura da célula será determinada pela altura da célula com o componente mais alto na linha.
Se uma célula fôr maior que o componente que contém, este será centrado na célula, horizontal e verticalmente. Podemos, no entanto, alterar este comportamento, com o argumento sticky como veremos mais à frente.
bt = Button(window, text="Gravar")
bt.grid(row=1, column=2)
No exemplo acima, criámos um botão e posicionámo-lo usando O método grid() na linha 1, coluna 2.
Se omitirmos o argumento column o componente será posicionado na coluna 0 da linha respetiva.
Atributos
| Opção | Descrição | Valores |
|---|---|---|
| row | Posiciona o componente nesta linha. So omitida, insere o componente na primeira linha vazia. | Valores inteiros a começar no 0 |
| column | Posiciona o componente nesta coluna. So omitida, insere o componente na coluna 0 da linha. | Valores inteiros a começar no 0 |
| rowspan | Indica que a célula pode ocupar múltiplas linhas | Valor inteiro |
| columnspan | Indica que a célula pode ocupar múltiplas colunas | Valor inteiro |
| sticky | Define como alinhar o componente na célula se esta for maior que o componente. Pode ser uma combinação dos valores a seguir. | N, S, E, W, NE, NW, SE, SW. Defeito: centra o componente na célula |
| ipadx | Padding horizontal interno | Nr de pixeis, 0(defeito) |
| ipady | Padding vertical interno | Nr de pixeis, 0(defeito) |
| padx | Padding horizontal externo | Nr de pixeis, 0(defeito) |
| pady | Padding vertical externo | Nr de pixeis, 0(defeito) |
Métodos columnconfigure() e rowconfigure()
columnconfigure()
O método columnconfigure em Python Tkinter é utilizado para configurar o comportamento das colunas num layout gerido pelo método grid(). Ele permite definir propriedades como o peso (weight) de cada coluna, o que determina como o espaço extra da janela será distribuído entre as colunas quando a janela for redimensionada.
Principais usos do columnconfigure:
- weight: Define a “importância” da coluna ao distribuir espaço extra. Por exemplo, se a coluna 0 tem weight=1 e a coluna 1 tem weight=3, a coluna 1 receberá três vezes mais espaço extra do que a coluna 0 ao aumentar o tamanho da janela.
- pad: Permite adicionar espaçamento (padding) extra ao redor de toda a coluna
Exemplo prático:
import tkinter as tk
root = tk.Tk()
root.columnconfigure(0, weight=1)
root.columnconfigure(1, weight=3)
# Adicionando componentes nas colunas 0 e 1
tk.Label(root, text="Coluna 0").grid(row=0, column=0)
tk.Label(root, text="Coluna 1").grid(row=0, column=1)
root.mainloop()
No exemplo acima, ao redimensionar a janela, a coluna 1 será três vezes mais larga que a coluna 0, pois recebeu um weight maior.
rowconfigure()
O método rowconfigure em Python Tkinter é utilizado para configurar o comportamento das linhas num layout gerido pelo método grid(). Ele permite definir como o espaço extra da janela será distribuído entre as linhas quando a janela for redimensionada, tornando o layout mais flexível e responsivo.
Principais usos do rowconfigure:
- weight: Define a “importância” da linha na distribuição do espaço extra. Por exemplo, se uma linha tem
weight=8e as outras têmweight=1, ela receberá uma fatia maior do espaço disponível quando a janela aumentar ou diminuir de tamanho. - minsize: Define a altura mínima da linha, garantindo que ela nunca fique menor que esse valor, mesmo se a janela for reduzida.
- pad: Adiciona espaçamento extra ao redor da linha (menos comum, mas possível).
Exemplo prático:
import tkinter as tk
root = tk.Tk()
root.geometry("400x300")
root.rowconfigure(0, weight=1, minsize=50) # Linha 0 com peso 1 e altura mínima de 50
root.rowconfigure(1, weight=8, minsize=50) # Linha 1 com peso 8 e altura mínima de 50
root.rowconfigure(2, weight=1) # Linha 2 com peso 1
# Adicionando widgets nas linhas
tk.Label(root, text="Linha 0").grid(row=0, column=0, sticky="nsew")
tk.Label(root, text="Linha 1").grid(row=1, column=0, sticky="nsew")
tk.Label(root, text="Linha 2").grid(row=2, column=0, sticky="nsew")
root.mainloop()
Exemplos com grid()
Exemplo 1:
from tkinter import *
window = Tk()
window.title("Tkinter - Grid")
lbl1= Label(window, text="Linha 0, Coluna 0", bg="red", fg="white")
lbl2= Label(window, text="Linha 1, Coluna 1", bg="yellow", fg="black")
lbl3= Label(window, text="Linha 2, Coluna 2", bg="green", fg="white")
lbl1.grid(row=0,column=0, padx= 10, pady=10)
lbl2.grid(row=1,column=1,padx= 10, pady=10)
lbl3.grid(row=2,column=2,padx= 10, pady=10)
#entra no loop de eventos
window.mainloop()
Saída:

Exemplo 2:
from tkinter import *
window = Tk()
window.title("Tkinter - Grid")
#Labels:
Label(window, text="Nome:").grid(row=0, sticky=W)
Label(window, text="Morada:").grid(row=1, sticky=W)
#Caixas de texto:
e1 = Entry(window)
e2 = Entry(window)
e1.grid(row=0, column=1)
e2.grid(row=1, column=1)
#entra no loop de eventos
window.mainloop()
Saída:

Exemplo 3:
from tkinter import *
window = Tk()
window.title("Tkinter - Grid")
#window.geometry("200x130")
#Labels:
label1 = Label(window, text="Altura:")
label2 = Label(window, text="Largura:")
label1.grid(sticky=E)
label2.grid(sticky=E)
#Caixas de texto:
entry1 = Entry(window)
entry1.grid(row=0, column=1)
entry2 = Entry(window)
entry2.grid(row=1, column=1)
#Checkbutton:
checkbutton = Checkbutton(window)
checkbutton.grid(columnspan=2, sticky=W)
#Imagem:
img = PhotoImage(file='alien_small1.gif')
image = Label(window, image=img)
image.grid(row=0, column=2, columnspan=2, rowspan=2,
sticky=W+E+N+S, padx=5, pady=5)
#Botões:
button1 = Button(window, text="Zoom In")
button1.grid(row=2, column=2)
button2 = Button(window, text="Zoom Out")
button2.grid(row=2, column=3)
#entra no loop de eventos
window.mainloop()
Saída:

