O gerenciador grid organiza widgets em uma tabela virtual. Cada célula é definida pelos parâmetros row (linha) e column (coluna), ambos começando em zero.
import tkinter as tk
def centralizar(janela, largura, altura):
largura_tela = janela.winfo_screenwidth()
altura_tela = janela.winfo_screenheight()
pos_x = (largura_tela - largura) // 2
pos_y = (altura_tela - altura) // 2
janela.geometry(f"{largura}x{altura}+{pos_x}+{pos_y}")
app = tk.Tk()
app.title("Exemplo Grid")
centralizar(app, 320, 120)
tk.Button(app, text="A1", bg="coral").grid(row=0, column=0)
tk.Button(app, text="B1", bg="gold").grid(row=0, column=1)
tk.Button(app, text="C1", bg="lightblue").grid(row=0, column=2)
tk.Button(app, text="C2", bg="coral").grid(row=1, column=2)
tk.Button(app, text="D2", bg="gold").grid(row=1, column=3)
tk.Button(app, text="E2", bg="lightblue").grid(row=1, column=4)
app.mainloop()
Alinhamento dentro da célula
Por padrão, o widget fica centralizado na célula. Para ancorá-lo a um lado ou preenchê-la, use sticky com as constantes de direção N, S, E e W. É possível combiná-las com o operador +.
import tkinter as tk
app = tk.Tk()
app.title("Alinhamento Sticky")
app.geometry("300x100")
tk.Button(app, text="Direita", bg="coral").grid(row=0, column=0, sticky=tk.E)
tk.Button(app, text="Centro", bg="gold").grid(row=0, column=1)
tk.Button(app, text="Padrão", bg="lightblue").grid(row=0, column=2)
tk.Button(app, text="Largo", bg="coral", width=10).grid(row=1, column=0)
tk.Button(app, text="Meio", bg="gold").grid(row=1, column=1)
tk.Button(app, text="Fim", bg="lightblue").grid(row=1, column=2)
app.mainloop()
Mesclando células
Para que um widget ocupe mais de uma linha ou coluna, utilize rowspan e columnspan. Geralmente acompanha sticky para que o componente preencha o espaço conquisatdo.
import tkinter as tk
app = tk.Tk()
app.title("Mesclando Células")
app.geometry("320x120")
tk.Button(app, text="Topo expandido", bg="coral").grid(
row=0, column=0, columnspan=2, sticky=tk.E + tk.W
)
tk.Button(app, text="Lateral", bg="lightblue").grid(row=0, column=2)
tk.Button(app, text="A3", bg="coral").grid(row=1, column=0)
tk.Button(app, text="B3", bg="gold").grid(row=1, column=1)
tk.Button(app, text="C3", bg="lightblue").grid(row=1, column=2)
tk.Button(app, text="Vertical", bg="gold").grid(
row=0, column=3, rowspan=2, ipady=10, sticky=tk.N + tk.S + tk.E + tk.W
)
app.mainloop()
Margens internas e externas
padx e pady definem o espaço externo entre o widget e as bordas da célula. ipadx e ipady aumnetam o espaço interno entre o conteúdo e a borda do próprio widget.
import tkinter as tk
app = tk.Tk()
app.title("Espaçamento")
app.geometry("340x120")
tk.Button(app, text="Com margem", bg="coral").grid(
row=0, column=0,
padx=8, pady=8,
ipadx=8, ipady=8
)
tk.Button(app, text="Padrão", bg="gold").grid(row=0, column=1)
tk.Button(app, text="Simples", bg="lightblue").grid(row=0, column=2)
tk.Button(app, text="A4", bg="coral").grid(row=1, column=2)
tk.Button(app, text="B4", bg="gold").grid(row=1, column=3)
tk.Button(app, text="C4", bg="lightblue").grid(row=1, column=4)
app.mainloop()