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çãoDescriçãoValores
rowPosiciona o componente nesta linha. So omitida, insere o componente na primeira linha vazia.Valores inteiros a começar no 0
columnPosiciona o componente nesta coluna. So omitida, insere o componente na coluna 0 da linha.Valores inteiros a começar no 0
rowspanIndica que a célula pode ocupar múltiplas linhasValor inteiro
columnspanIndica que a célula pode ocupar múltiplas colunasValor inteiro
stickyDefine 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
ipadxPadding horizontal internoNr de pixeis, 0(defeito)
ipadyPadding vertical internoNr de pixeis, 0(defeito)
padxPadding horizontal externoNr de pixeis, 0(defeito)
padyPadding vertical externoNr 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=8 e as outras têm weight=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: