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:

