Organizando Widgets com Grid no tkinter do Python

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()

Tags: Tkinter Python Grid Geometry Manager sticky rowspan

Publicado em 7-3 08:29