Caixa de diálogo personalizada

Para criar uma caixa de diálogo personalizada, crie uma subclasse de Dialog e sobrescreva os seus métodos:

body(self, master): Neste método construimos os componentes da caixa de diálogo e devolvemos o componentet que recebe o foco inicial.

apply(self): Neste método definimos o que fazer quando o utilizador confirma o diálogo (por exemplo, processar a entrada).

Opcionalmente, substitua validate(self) para verificar a entrada antes de fechar.

Exemplo 1:

import tkinter as tk
from tkinter.simpledialog import Dialog

class IdDialogo(Dialog):
    def body(self, master):
        tk.Label(master, text="Nome:").pack()
        self.nome = tk.Entry(master)
        self.nome.pack()
        tk.Label(master, text="Idade:").pack()
        self.idade = tk.Entry(master)
        self.idade.pack()
        return self.nome  # foco inicial

    def apply(self):
        self.nome = self.nome.get()
        self.idade = self.idade.get()

root = tk.Tk()
root.withdraw()  # Oculta a janela principal

dialogo = IdDialogo(root, title="Identificação")
print("Nome:", dialogo.nome)
print("Idade:", dialogo.idade)

NOTA: quando instanciamos a classe IdDialogo passamos o argumento title ao construtor da classe Dialog.

Saída:

Podemos

Podemos igualmente criar uma janela personalizada usando tk.Toplevel, com validação de dados:

import tkinter as tk
from tkinter import messagebox
import re

def abrir_dialogo():
    def validar():
        texto = entrada.get()
        if re.match(r"^\d+$", texto):  # Aceita apenas números
            messagebox.showinfo("Sucesso", f"Você digitou: {texto}")
            dialogo.destroy()
        else:
            messagebox.showerror("Erro", "Digite apenas números!")

    dialogo = tk.Toplevel(root)
    dialogo.title("Numeros")
    tk.Label(dialogo, text="Digite apenas números:").pack()
    entrada = tk.Entry(dialogo)
    entrada.pack()
    tk.Button(dialogo, text="Enviar", command=validar).pack()

root = tk.Tk()
tk.Button(root, text="Abrir diálogo", command=abrir_dialogo).pack()
root.mainloop()

Saída: