Tkinter no Python: interfaces gráficas e widgets

Leandro Hirt Leandro Hirt
Tkinter no Python: interfaces gráficas e widgets

O Tkinter é a biblioteca padrão do Python para criar interfaces gráficas com janelas, botões, campos de texto, menus e outros componentes. Neste guia, você vai abrir sua primeira janela, organizar widgets e construir um formulário funcional.

O que é Tkinter?

Tkinter é a interface do Python para o toolkit gráfico Tk. Ele é indicado para aprender programação orientada a eventos, criar ferramentas de desktop, protótipos e aplicações internas sem instalar frameworks gráficos complexos.

Em muitas instalações do Python, o Tkinter já está disponível. Para verificar, execute no terminal:

python -m tkinter

Se uma pequena janela de demonstração for aberta, a biblioteca está funcionando corretamente.

Como criar a primeira janela com Tkinter

import tkinter as tk

janela = tk.Tk()
janela.title("Minha primeira interface")
janela.geometry("420x240")

mensagem = tk.Label(janela, text="Olá, Tkinter!")
mensagem.pack(pady=30)

janela.mainloop()

O método tk.Tk() cria a janela principal. title() define o título, geometry() determina o tamanho inicial e mainloop() mantém a interface aberta, aguardando ações do usuário.

Principais widgets do Tkinter

WidgetFunçãoExemplo de uso
LabelExibe textos ou imagensTítulos e mensagens
ButtonExecuta uma função ao clicarSalvar, calcular ou fechar
EntryRecebe texto em uma linhaNome, e-mail ou número
TextRecebe textos com várias linhasObservações e editores
FrameAgrupa outros widgetsOrganização da interface
CheckbuttonRepresenta uma opção marcada ou desmarcadaPreferências
RadiobuttonSeleciona uma opção entre váriasPlanos ou categorias
ListboxExibe uma lista selecionávelItens, arquivos ou usuários

Para interfaces com aparência mais consistente, também é possível usar os widgets do módulo tkinter.ttk.

Como organizar os elementos: pack, grid e place

pack()

Organiza os elementos em blocos, um após o outro. É simples e funciona bem em interfaces pequenas.

tk.Label(janela, text="Título").pack(pady=10)
tk.Button(janela, text="Continuar").pack()

grid()

Distribui os widgets em linhas e colunas. É a melhor escolha para formulários, calculadoras e telas com alinhamento regular.

tk.Label(janela, text="Nome:").grid(row=0, column=0, padx=8, pady=8)
tk.Entry(janela).grid(row=0, column=1, padx=8, pady=8)

place()

Posiciona elementos por coordenadas ou proporções. Ele oferece controle preciso, mas tende a exigir mais manutenção quando a janela muda de tamanho.

Não use pack() e grid() no mesmo contêiner. Você pode usar gerenciadores diferentes em Frames distintos.

Eventos e o parâmetro command

Uma interface gráfica reage a eventos. O evento mais comum é o clique em um botão, associado a uma função pelo parâmetro command.

import tkinter as tk


def alterar_texto():
    mensagem.config(text="Botão clicado!")


janela = tk.Tk()
janela.title("Eventos no Tkinter")

mensagem = tk.Label(janela, text="Aguardando ação")
mensagem.pack(padx=30, pady=15)

tk.Button(janela, text="Clique aqui", command=alterar_texto).pack(pady=10)

janela.mainloop()

Observe que usamos command=alterar_texto, sem parênteses. Assim, a função é executada somente quando o botão é clicado.

Projeto completo: formulário de cadastro

O exemplo a seguir combina ttk, campos de entrada, validação básica e uma caixa de mensagem.

import tkinter as tk
from tkinter import messagebox, ttk


def cadastrar():
    nome = entrada_nome.get().strip()
    email = entrada_email.get().strip()

    if not nome or not email:
        messagebox.showwarning("Campos obrigatórios", "Preencha nome e e-mail.")
        return

    if "@" not in email:
        messagebox.showerror("E-mail inválido", "Digite um endereço de e-mail válido.")
        return

    resultado.config(text=f"Cadastro realizado para {nome}.")
    entrada_nome.delete(0, tk.END)
    entrada_email.delete(0, tk.END)
    entrada_nome.focus()


janela = tk.Tk()
janela.title("Cadastro de usuário")
janela.resizable(False, False)

conteudo = ttk.Frame(janela, padding=20)
conteudo.grid()

ttk.Label(conteudo, text="Nome:").grid(row=0, column=0, sticky="w", pady=6)
entrada_nome = ttk.Entry(conteudo, width=32)
entrada_nome.grid(row=0, column=1, pady=6)

ttk.Label(conteudo, text="E-mail:").grid(row=1, column=0, sticky="w", pady=6)
entrada_email = ttk.Entry(conteudo, width=32)
entrada_email.grid(row=1, column=1, pady=6)

ttk.Button(conteudo, text="Cadastrar", command=cadastrar).grid(
    row=2, column=0, columnspan=2, pady=12
)

resultado = ttk.Label(conteudo, text="")
resultado.grid(row=3, column=0, columnspan=2)

entrada_nome.focus()
janela.bind("<Return>", lambda evento: cadastrar())
janela.mainloop()

Organizando uma aplicação Tkinter com classes

À medida que o projeto cresce, uma classe ajuda a reunir widgets, estado e eventos em uma estrutura mais clara.

import tkinter as tk
from tkinter import ttk


class Aplicacao(ttk.Frame):
    def __init__(self, janela):
        super().__init__(janela, padding=20)
        self.grid()

        self.texto = ttk.Label(self, text="Minha aplicação")
        self.texto.grid(row=0, column=0, pady=10)

        ttk.Button(
            self,
            text="Atualizar",
            command=self.atualizar,
        ).grid(row=1, column=0)

    def atualizar(self):
        self.texto.config(text="Interface atualizada!")


janela = tk.Tk()
janela.title("Tkinter com classes")
Aplicacao(janela)
janela.mainloop()

Para manter nomes, espaçamento e organização consistentes, consulte também o guia de PEP 8 no Python.

Erros comuns no Tkinter

  • Esquecer o mainloop(): sem ele, a janela não permanece ativa.
  • Executar uma função ao criar o botão: use command=minha_funcao, não command=minha_funcao().
  • Misturar pack e grid no mesmo contêiner: isso pode gerar conflito no layout.
  • Bloquear a interface: tarefas demoradas dentro do evento impedem a janela de responder.
  • Usar variáveis locais que deixam de existir: mantenha referências aos widgets e às variáveis de controle enquanto forem necessárias.

Próximo projeto: calculadora gráfica

Uma calculadora é um ótimo exercício para combinar Entry, botões, eventos, validação e organização em funções. Veja o tutorial de como fazer uma calculadora em Python, que inclui uma versão completa com Tkinter.

Perguntas frequentes sobre Tkinter

Preciso instalar o Tkinter?

Em muitas instalações oficiais do Python, não. Execute python -m tkinter para verificar. Em algumas distribuições Linux, pode ser necessário instalar o pacote do sistema correspondente.

Tkinter serve para aplicações profissionais?

Sim, especialmente para ferramentas internas, utilitários e aplicações de desktop de pequeno e médio porte. A escolha depende das necessidades visuais, de distribuição e de manutenção do projeto.

Qual a diferença entre Tkinter e ttk?

tkinter fornece a base da interface. tkinter.ttk oferece widgets temáticos que seguem melhor a aparência do sistema operacional.

Como limpar um campo Entry?

Use campo.delete(0, tk.END). Para inserir um valor, use campo.insert(0, "texto").

Conclusão

Com Tkinter, você pode transformar scripts em aplicações de desktop interativas. Domine primeiro a janela principal, os widgets, os gerenciadores de layout e os eventos. Depois, organize o projeto com funções, frames e classes para criar interfaces mais fáceis de manter.

Artigos relacionados