import tkinter as tk from tkinter import ttk, messagebox, simpledialog from persistencia.excecoes import EntidadeNaoEncontradaException from modelo.pessoa import Pessoa class FramePessoas(tk.Frame): def __init__(self, master=None, bd=None): super().__init__(master, bg="#1e1e1e") self.bd = bd self._criar_layout() def _criar_layout(self): titulo_label = tk.Label( self, text="GERENCIAR PESSOAS", font=("Arial", 24, "bold"), bg="#1e1e1e", fg="white" ) titulo_label.pack(pady=20) # Frame de busca busca_frame = tk.Frame(self, bg="#1e1e1e") busca_frame.pack(pady=5, padx=20, fill="x") tk.Label(busca_frame, text="Buscar por ID ou Nome:", bg="#1e1e1e", fg="white").pack(side="left", padx=(0, 5)) self.entry_busca = tk.Entry(busca_frame, bg="#2c2c2c", fg="white", insertbackground="white", width=40) self.entry_busca.pack(side="left", fill="x", expand=True) self.entry_busca.bind("", lambda event: self._realizar_busca()) btn_buscar = tk.Button(busca_frame, text="Buscar", command=self._realizar_busca, bg="#1f6aa5", fg="white", relief="flat") btn_buscar.pack(side="left", padx=5) btn_limpar = tk.Button(busca_frame, text="Limpar", command=self._limpar_busca, bg="#555555", fg="white", relief="flat") btn_limpar.pack(side="left", padx=5) # Estilo da Treeview style = ttk.Style() style.theme_use("default") style.configure("Treeview", background="#2c2c2c", foreground="white", rowheight=25, fieldbackground="#2c2c2c", bordercolor="#2c2c2c", borderwidth=0) style.map('Treeview', background=[('selected', '#1f6aa5')]) style.configure("Treeview.Heading", background="#2c2c2c", foreground="white", font=("Arial", 12, "bold"), relief="flat") style.map("Treeview.Heading", background=[('active', '#3c3c3c')]) tree_container = tk.Frame(self, bg="#1e1e1e") tree_container.pack(pady=10, padx=20, fill="both", expand=True) self.tree = ttk.Treeview(tree_container, columns=("id", "nome"), show="headings") self.tree.heading("id", text="ID") self.tree.heading("nome", text="Nome", anchor="w") self.tree.column("id", width=100, anchor="center", stretch=tk.NO) self.tree.column("nome", anchor="w", stretch=tk.YES) scrollbar = ttk.Scrollbar(tree_container, orient="vertical", command=self.tree.yview) self.tree.configure(yscrollcommand=scrollbar.set) self.tree.pack(side="left", fill="both", expand=True) scrollbar.pack(side="right", fill="y") self.popular_treeview() botoes_frame = tk.Frame(self, bg="#1e1e1e") botoes_frame.pack(pady=10, padx=20, fill="x") btn_adicionar = tk.Button( botoes_frame, text="Adicionar", command=self.adicionar_pessoa, bg="#4CAF50", fg="white", font=("Arial", 12), relief="flat", padx=10, pady=5 ) btn_adicionar.pack(side="left", padx=5) # Botão Alterar btn_alterar = tk.Button( botoes_frame, text="Alterar", command=self.alterar_pessoa, bg="#ffc107", # Cor amarela para edição fg="white", font=("Arial", 12), relief="flat", padx=10, pady=5 ) btn_alterar.pack(side="left", padx=5) btn_apagar = tk.Button( botoes_frame, text="Apagar", command=self.apagar_pessoa, bg="#f44336", fg="white", font=("Arial", 12), relief="flat", padx=10, pady=5 ) btn_apagar.pack(side="left", padx=5) def popular_treeview(self, lista_pessoas=None): for i in self.tree.get_children(): self.tree.delete(i) if lista_pessoas is None: lista_pessoas = self.bd.pessoas.listar_todos() for pessoa in lista_pessoas: self.tree.insert("", "end", values=(pessoa.id, pessoa.nome)) def adicionar_pessoa(self): nome = simpledialog.askstring("Adicionar Pessoa", "Digite o nome da nova pessoa:", parent=self) if nome: proximo_id = self.bd.obter_proximo_id_pessoa() nova_pessoa = Pessoa(proximo_id, nome) self.bd.pessoas.inserir(nova_pessoa) self.popular_treeview() messagebox.showinfo("Sucesso", "Pessoa adicionada com sucesso.") def alterar_pessoa(self): selecionado = self.tree.selection() if not selecionado: messagebox.showwarning("Aviso", "Por favor, selecione uma pessoa para alterar.") return item = self.tree.item(selecionado[0]) id_pessoa, nome_atual = item['values'] novo_nome = simpledialog.askstring( "Alterar Pessoa", "Digite o novo nome:", initialvalue=nome_atual, parent=self ) if novo_nome and novo_nome.strip() and novo_nome.strip() != nome_atual: try: pessoa = self.bd.pessoas.buscar_por_id(id_pessoa) if pessoa: pessoa.nome = novo_nome.strip() self.bd.pessoas.alterar(pessoa.id, pessoa) self.popular_treeview() messagebox.showinfo("Sucesso", "Pessoa alterada com sucesso.") except EntidadeNaoEncontradaException as e: messagebox.showerror("Erro", f"Não foi possível alterar: {e}\nA lista será atualizada.") self.popular_treeview() def apagar_pessoa(self): selecionado = self.tree.selection() if not selecionado: messagebox.showwarning("Aviso", "Por favor, selecione uma pessoa para apagar.") return item = self.tree.item(selecionado[0]) id_pessoa, nome_pessoa = item['values'] msg = (f"Tem certeza que deseja apagar '{nome_pessoa}'?\n" "AVISO: Todas as adoções associadas a esta pessoa também serão removidas.") if messagebox.askyesno("Confirmar Exclusão", msg, icon='warning'): try: self.bd.remover_pessoa(id_pessoa) self.popular_treeview() messagebox.showinfo("Sucesso", "Pessoa e suas adoções foram apagadas com sucesso.") except EntidadeNaoEncontradaException as e: messagebox.showerror("Erro", f"Não foi possível apagar: {e}\nA lista será atualizada.") self.popular_treeview() def _realizar_busca(self): termo_busca = self.entry_busca.get().strip().lower() if not termo_busca: self.popular_treeview() return todas_pessoas = self.bd.pessoas.listar_todos() resultados = [p for p in todas_pessoas if termo_busca in str(p.id) or termo_busca in p.nome.lower()] self.popular_treeview(resultados) def _limpar_busca(self): self.entry_busca.delete(0, tk.END) self.popular_treeview()