Tela
This commit is contained in:
parent
987c128917
commit
b43a9e63f2
Binary file not shown.
After Width: | Height: | Size: 8.9 KiB |
Binary file not shown.
After Width: | Height: | Size: 1.1 KiB |
Binary file not shown.
After Width: | Height: | Size: 128 KiB |
6
main.py
6
main.py
|
@ -1,6 +1,6 @@
|
||||||
# from visao.interface_texto import InterfaceTexto
|
from visao.cli import InterfaceTexto
|
||||||
from visao.interface_gui import InterfaceGUI
|
from visao.tela_principal import TelaPrincipal
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
app = InterfaceGUI()
|
app = TelaPrincipal()
|
||||||
app.mainloop()
|
app.mainloop()
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
import tkinter as tk
|
||||||
|
|
||||||
|
class FrameInicio(tk.Frame):
|
||||||
|
def __init__(self, master=None):
|
||||||
|
super().__init__(master, bg="#1e1e1e")
|
||||||
|
|
||||||
|
self.caixas_info = [
|
||||||
|
{"titulo": "Pessoas", "quantidade": 0, "cor": "#ff9966"},
|
||||||
|
{"titulo": "Pets", "quantidade": 0, "cor": "#66c2ff"},
|
||||||
|
{"titulo": "Adoções", "quantidade": 0, "cor": "#99e699"},
|
||||||
|
]
|
||||||
|
|
||||||
|
self._criar_layout()
|
||||||
|
|
||||||
|
def _criar_layout(self):
|
||||||
|
container = tk.Frame(self, bg="#1e1e1e")
|
||||||
|
container.pack(pady=40, padx=50, fill="x")
|
||||||
|
|
||||||
|
for caixa in self.caixas_info:
|
||||||
|
frame = tk.Frame(container, bg=caixa["cor"], width=200, height=120)
|
||||||
|
frame.pack(side="left", expand=True, padx=10, pady=10, fill="both")
|
||||||
|
|
||||||
|
titulo = tk.Label(frame, text=caixa["titulo"], font=("Arial", 16, "bold"), bg=caixa["cor"], fg="white")
|
||||||
|
titulo.pack(pady=(20, 5))
|
||||||
|
|
||||||
|
valor = tk.Label(frame, text=str(caixa["quantidade"]), font=("Arial", 24), bg=caixa["cor"], fg="white")
|
||||||
|
valor.pack()
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
import tkinter as tk
|
||||||
|
|
||||||
|
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):
|
||||||
|
# Título da seção
|
||||||
|
titulo_label = tk.Label(
|
||||||
|
self,
|
||||||
|
text="GERENCIAR PESSOAS",
|
||||||
|
font=("Arial", 24, "bold"),
|
||||||
|
bg="#1e1e1e",
|
||||||
|
fg="white"
|
||||||
|
)
|
||||||
|
titulo_label.pack(pady=20)
|
|
@ -1,158 +0,0 @@
|
||||||
import tkinter as tk
|
|
||||||
from tkinter import font as tkfont
|
|
||||||
from tkinter import messagebox # Usado para os botões de exemplo
|
|
||||||
|
|
||||||
class InterfaceGUI(tk.Tk):
|
|
||||||
"""Classe principal que gerencia a janela e os frames (painéis)."""
|
|
||||||
def __init__(self, *args, **kwargs):
|
|
||||||
super().__init__(*args, **kwargs)
|
|
||||||
|
|
||||||
self.title("Sistema de Adoção de Pets")
|
|
||||||
# Um pouco maior para acomodar melhor o design
|
|
||||||
self.geometry("1024x600")
|
|
||||||
self.minsize(900, 550) # Define um tamanho mínimo
|
|
||||||
self.configure(bg="#1e1e1e")
|
|
||||||
|
|
||||||
# Define fontes para serem usadas na aplicação
|
|
||||||
self.title_font = tkfont.Font(family='Helvetica', size=16, weight="bold")
|
|
||||||
self.label_font = tkfont.Font(family='Helvetica', size=10)
|
|
||||||
self.button_font = tkfont.Font(family='Helvetica', size=20, weight="bold")
|
|
||||||
self.widget_title_font = tkfont.Font(family='Helvetica', size=12, weight="bold")
|
|
||||||
|
|
||||||
# Container principal que usa todo o espaço
|
|
||||||
container = tk.Frame(self, bg="#1e1e1e")
|
|
||||||
container.pack(side="top", fill="both", expand=True)
|
|
||||||
container.grid_rowconfigure(0, weight=1)
|
|
||||||
container.grid_columnconfigure(0, weight=1)
|
|
||||||
|
|
||||||
self.frames = {}
|
|
||||||
# Adicione futuras classes de painel aqui
|
|
||||||
for F in (HomePage,):
|
|
||||||
page_name = F.__name__
|
|
||||||
frame = F(parent=container, controller=self)
|
|
||||||
self.frames[page_name] = frame
|
|
||||||
frame.grid(row=0, column=0, sticky="nsew")
|
|
||||||
|
|
||||||
self.show_frame("HomePage")
|
|
||||||
|
|
||||||
def show_frame(self, page_name):
|
|
||||||
"""Mostra um frame para a página requisitada."""
|
|
||||||
frame = self.frames[page_name]
|
|
||||||
frame.tkraise()
|
|
||||||
|
|
||||||
class ActionCard(tk.Frame):
|
|
||||||
"""Um widget 'Card' reutilizável para as ações principais."""
|
|
||||||
def __init__(self, parent, controller, title, description, command):
|
|
||||||
super().__init__(parent, bg="#2d2d2d", relief="raised", borderwidth=1)
|
|
||||||
|
|
||||||
# Adiciona um padding interno ao card
|
|
||||||
self.grid_propagate(False) # Impede que os widgets filhos redimensionem o card
|
|
||||||
self.config(width=250, height=180) # Tamanho fixo para o card
|
|
||||||
|
|
||||||
title_label = tk.Label(
|
|
||||||
self,
|
|
||||||
text=title,
|
|
||||||
font=controller.widget_title_font,
|
|
||||||
fg="white",
|
|
||||||
bg="#2d2d2d"
|
|
||||||
)
|
|
||||||
title_label.pack(pady=(15, 5))
|
|
||||||
|
|
||||||
desc_label = tk.Label(
|
|
||||||
self,
|
|
||||||
text=description,
|
|
||||||
font=controller.label_font,
|
|
||||||
fg="#cccccc", # Um cinza mais claro
|
|
||||||
bg="#2d2d2d"
|
|
||||||
)
|
|
||||||
desc_label.pack(pady=5)
|
|
||||||
|
|
||||||
# Botão de ação estilizado como um ícone
|
|
||||||
action_button = tk.Button(
|
|
||||||
self,
|
|
||||||
text="➕", # Um ícone de 'mais' simples. Você pode usar uma imagem aqui.
|
|
||||||
font=controller.button_font,
|
|
||||||
fg="white",
|
|
||||||
bg="#4a4a4a",
|
|
||||||
activebackground="#6a6a6a",
|
|
||||||
activeforeground="white",
|
|
||||||
relief="flat",
|
|
||||||
width=3,
|
|
||||||
command=command
|
|
||||||
)
|
|
||||||
action_button.pack(side="bottom", pady=15)
|
|
||||||
|
|
||||||
class HomePage(tk.Frame):
|
|
||||||
"""Painel da tela inicial (Home), agora com o layout de cards."""
|
|
||||||
def __init__(self, parent, controller):
|
|
||||||
super().__init__(parent, bg="#1e1e1e")
|
|
||||||
self.controller = controller
|
|
||||||
|
|
||||||
# Configura o grid principal da HomePage para ter 2 colunas e 2 linhas
|
|
||||||
self.grid_columnconfigure(0, weight=2) # Coluna da esquerda (cards)
|
|
||||||
self.grid_columnconfigure(1, weight=1) # Coluna da direita (configurações)
|
|
||||||
self.grid_rowconfigure(0, weight=0) # Linha para o header (não expande)
|
|
||||||
self.grid_rowconfigure(1, weight=1) # Linha para o conteúdo principal (expande)
|
|
||||||
|
|
||||||
# --- Header com ícone e título ---
|
|
||||||
header_frame = tk.Frame(self, bg="#1e1e1e")
|
|
||||||
# Coloca o header na primeira linha, ocupando as duas colunas
|
|
||||||
header_frame.grid(row=0, column=0, columnspan=2, sticky="ew", padx=20, pady=(20, 0))
|
|
||||||
|
|
||||||
home_icon = tk.Label(
|
|
||||||
header_frame,
|
|
||||||
text="🏠", # Ícone de casa
|
|
||||||
font=controller.title_font,
|
|
||||||
fg="white",
|
|
||||||
bg="#1e1e1e"
|
|
||||||
)
|
|
||||||
home_icon.pack(side="left", anchor="w")
|
|
||||||
|
|
||||||
home_label = tk.Label(
|
|
||||||
header_frame,
|
|
||||||
text="Home",
|
|
||||||
font=controller.title_font,
|
|
||||||
fg="white",
|
|
||||||
bg="#1e1e1e"
|
|
||||||
)
|
|
||||||
home_label.pack(side="left", padx=10, anchor="w")
|
|
||||||
|
|
||||||
# --- Frame da Esquerda para os ActionCards ---
|
|
||||||
left_frame = tk.Frame(self, bg="#1e1e1e")
|
|
||||||
left_frame.grid(row=1, column=0, sticky="nsew", padx=20, pady=20)
|
|
||||||
|
|
||||||
# Configura um grid dentro do frame da esquerda para os cards
|
|
||||||
left_frame.grid_columnconfigure((0, 1), weight=1)
|
|
||||||
left_frame.grid_rowconfigure((0, 1), weight=1)
|
|
||||||
|
|
||||||
# --- Frame da Direita para Controles e Botão ---
|
|
||||||
right_frame = tk.Frame(self, bg="#1e1e1e")
|
|
||||||
right_frame.grid(row=1, column=1, sticky="nsew", padx=20, pady=20)
|
|
||||||
right_frame.grid_columnconfigure(0, weight=1)
|
|
||||||
# As rows do frame da direita não precisam expandir, então não configuramos rowconfigure
|
|
||||||
|
|
||||||
# --- Criando e posicionando os CARDS ---
|
|
||||||
# Exemplo de comandos. Troque isso pelas suas funções reais.
|
|
||||||
cmd_pets = lambda: messagebox.showinfo("Ação", "Abrir gerenciamento de Pets")
|
|
||||||
cmd_pessoas = lambda: messagebox.showinfo("Ação", "Abrir gerenciamento de Pessoas")
|
|
||||||
cmd_adocoes = lambda: messagebox.showinfo("Ação", "Abrir tela para nova adoção")
|
|
||||||
cmd_historico = lambda: messagebox.showinfo("Ação", "Abrir histórico de adoções")
|
|
||||||
|
|
||||||
card1 = ActionCard(left_frame, controller, "Gerenciar Pets", "Adicionar, editar e remover pets", cmd_pets)
|
|
||||||
card1.grid(row=0, column=0, padx=10, pady=10, sticky="nsew")
|
|
||||||
|
|
||||||
card2 = ActionCard(left_frame, controller, "Gerenciar Pessoas", "Cadastrar adotantes e doadores", cmd_pessoas)
|
|
||||||
card2.grid(row=0, column=1, padx=10, pady=10, sticky="nsew")
|
|
||||||
|
|
||||||
card3 = ActionCard(left_frame, controller, "Realizar Adoção", "Iniciar um novo processo de adoção", cmd_adocoes)
|
|
||||||
card3.grid(row=1, column=0, padx=10, pady=10, sticky="nsew")
|
|
||||||
|
|
||||||
card4 = ActionCard(left_frame, controller, "Histórico", "Consultar adoções realizadas", cmd_historico)
|
|
||||||
card4.grid(row=1, column=1, padx=10, pady=10, sticky="nsew")
|
|
||||||
|
|
||||||
# --- Criando os widgets no FRAME DA DIREITA ---
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
app = InterfaceGUI()
|
|
||||||
app.mainloop()
|
|
|
@ -0,0 +1,108 @@
|
||||||
|
import tkinter as tk
|
||||||
|
from datetime import datetime
|
||||||
|
from tkinter import font as tkfont
|
||||||
|
from tkinter import messagebox
|
||||||
|
from PIL import Image, ImageTk
|
||||||
|
from persistencia.banco_dados import BancoDeDados
|
||||||
|
from modelo.pessoa import Pessoa
|
||||||
|
import os
|
||||||
|
|
||||||
|
class TelaPrincipal(tk.Tk):
|
||||||
|
def __init__(self):
|
||||||
|
super().__init__()
|
||||||
|
|
||||||
|
self.title("Sistema PETS")
|
||||||
|
self.geometry("900x600")
|
||||||
|
self.resizable(False, False)
|
||||||
|
self.configure(bg="#1e1e1e")
|
||||||
|
|
||||||
|
self.bd = BancoDeDados()
|
||||||
|
if not self.bd.pessoas.listar_todos(): # Adiciona apenas se estiver vazio
|
||||||
|
self.bd.pessoas.inserir(Pessoa(1, "Ana Silva"))
|
||||||
|
self.bd.pessoas.inserir(Pessoa(2, "Bruno Costa"))
|
||||||
|
self.bd.pessoas.inserir(Pessoa(3, "Carlos Dias"))
|
||||||
|
self.bd.pessoas.inserir(Pessoa(4, "Daniel Santos"))
|
||||||
|
|
||||||
|
|
||||||
|
self.header = tk.Frame(self, bg="#2c2c2c", height=80)
|
||||||
|
self.header.pack(side="top", fill="x")
|
||||||
|
self.header.pack_propagate(False)
|
||||||
|
|
||||||
|
script_dir = os.path.dirname(__file__)
|
||||||
|
logo_path = os.path.join(script_dir, "..", "assets", "images", "logo.png")
|
||||||
|
|
||||||
|
logo_pil = Image.open(logo_path)
|
||||||
|
logo_pil = logo_pil.resize((120, 80), Image.Resampling.LANCZOS)
|
||||||
|
self.logo_image = ImageTk.PhotoImage(logo_pil)
|
||||||
|
|
||||||
|
# O Label agora usa a imagem em vez de texto
|
||||||
|
self.logo_label = tk.Label(self.header, image=self.logo_image, bg="#2c2c2c")
|
||||||
|
self.logo_label.pack(side="left", padx=(10, 5))
|
||||||
|
# -----------------------------
|
||||||
|
|
||||||
|
self.relogio_label = tk.Label(self.header, font=("Arial", 12), bg="#2c2c2c", fg="white")
|
||||||
|
self.relogio_label.pack(side="right", padx=10)
|
||||||
|
|
||||||
|
self.atualizar_relogio()
|
||||||
|
|
||||||
|
self.menu_lateral = tk.Frame(self, bg="#2c2c2c", width=200)
|
||||||
|
self.menu_lateral.pack(side="left", fill="y")
|
||||||
|
self.menu_lateral.pack_propagate(False)
|
||||||
|
|
||||||
|
self.area_conteudo = tk.Frame(self, bg="#ccbcbc")
|
||||||
|
self.area_conteudo.pack(side="right", expand=True, fill="both")
|
||||||
|
|
||||||
|
botoes = [
|
||||||
|
("Início", self.mostrar_inicio),
|
||||||
|
("Pessoas", self.mostrar_pessoas),
|
||||||
|
("Pets", self.mostrar_inicio),
|
||||||
|
("Sair", self.sair),
|
||||||
|
]
|
||||||
|
|
||||||
|
for texto, comando in botoes:
|
||||||
|
btn = tk.Button(
|
||||||
|
self.menu_lateral,
|
||||||
|
text=texto,
|
||||||
|
command=comando,
|
||||||
|
bg="#2c2c2c",
|
||||||
|
fg="white",
|
||||||
|
activebackground="#3c3c3c",
|
||||||
|
activeforeground="white",
|
||||||
|
relief="flat",
|
||||||
|
borderwidth=0,
|
||||||
|
highlightthickness=0,
|
||||||
|
anchor="w",
|
||||||
|
padx=10,
|
||||||
|
)
|
||||||
|
btn.pack(fill="x", pady=2, padx=5)
|
||||||
|
|
||||||
|
self.mostrar_inicio()
|
||||||
|
|
||||||
|
def atualizar_relogio(self):
|
||||||
|
agora = datetime.now().strftime("%d-%m-%Y %H:%M:%S")
|
||||||
|
self.relogio_label.config(text=agora)
|
||||||
|
self.after(1000, self.atualizar_relogio)
|
||||||
|
|
||||||
|
def mostrar_inicio(self):
|
||||||
|
from visao.frames.frame_inicio import FrameInicio
|
||||||
|
self.limpar_conteudo()
|
||||||
|
frame = FrameInicio(self.area_conteudo)
|
||||||
|
frame.pack(expand=True, fill="both")
|
||||||
|
|
||||||
|
def mostrar_pessoas(self):
|
||||||
|
from visao.frames.frame_pessoa import FramePessoas
|
||||||
|
self.limpar_conteudo()
|
||||||
|
frame = FramePessoas(self.area_conteudo, self.bd)
|
||||||
|
frame.pack(expand=True, fill="both")
|
||||||
|
|
||||||
|
def limpar_conteudo(self):
|
||||||
|
for widget in self.area_conteudo.winfo_children():
|
||||||
|
widget.destroy()
|
||||||
|
|
||||||
|
def sair(self):
|
||||||
|
if messagebox.askyesno("Sair", "Tem certeza que deseja sair?"):
|
||||||
|
self.destroy()
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
app = TelaPrincipal()
|
||||||
|
app.mainloop()
|
Loading…
Reference in New Issue