pets/visao/frames/frame_pessoa.py

195 lines
7.1 KiB
Python

import tkinter as tk
from tkinter import ttk, messagebox, simpledialog
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("<Return>", 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()
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']
if messagebox.askyesno("Confirmar", f"Tem certeza que deseja apagar '{nome_pessoa}'?"):
try:
self.bd.pessoas.remover(id_pessoa)
self.popular_treeview()
messagebox.showinfo("Sucesso", "Pessoa apagada 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()