MizunoBrasil

(teste)Agenda de Compromissos

Feb 3rd, 2025
16
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.89 KB | None | 0 0
  1. import sqlite3
  2. import tkinter as tk
  3. from tkinter import messagebox, ttk
  4. from datetime import datetime
  5. import re
  6.  
  7. # Conectar ao banco de dados SQLite
  8. conexao = sqlite3.connect("agenda.db")
  9. cursor = conexao.cursor()
  10.  
  11. # Criar a tabela se ela não existir
  12. cursor.execute('''
  13. CREATE TABLE IF NOT EXISTS compromissos (
  14.    id INTEGER PRIMARY KEY AUTOINCREMENT,
  15.    titulo TEXT NOT NULL,
  16.    descricao TEXT,
  17.    data TEXT NOT NULL,
  18.    hora TEXT NOT NULL
  19. )
  20. ''')
  21. conexao.commit()
  22.  
  23. # Função para extrair a data e hora da descrição usando regex
  24. def extrair_data_hora(descricao):
  25.     padrao_data = re.search(r'\b(\d{2}/\d{2}/\d{4})\b', descricao)
  26.     padrao_hora = re.search(r'\b(\d{2}:\d{2})\b', descricao)
  27.    
  28.     if not padrao_data or not padrao_hora:
  29.         messagebox.showerror("Erro", "Data ou horário inválidos! Certifique-se de informar a data no formato DD/MM/AAAA e o horário no formato HH:MM dentro da descrição.")
  30.         return None, None
  31.  
  32.     data = padrao_data.group(0)
  33.     hora = padrao_hora.group(0)
  34.     return data, hora
  35.  
  36. # Função para adicionar compromisso
  37. def adicionar_compromisso():
  38.     titulo = entrada_titulo.get()
  39.     descricao = entrada_descricao.get("1.0", tk.END).strip()
  40.    
  41.     if not titulo or not descricao:
  42.         messagebox.showerror("Erro", "Por favor, preencha todos os campos obrigatórios.")
  43.         return
  44.  
  45.     data_compromisso, hora_compromisso = extrair_data_hora(descricao)
  46.     if not data_compromisso or not hora_compromisso:
  47.         return  # Interrompe se não tiver data ou hora válidas
  48.  
  49.     cursor.execute("INSERT INTO compromissos (titulo, descricao, data, hora) VALUES (?, ?, ?, ?)",
  50.                    (titulo, descricao, data_compromisso, hora_compromisso))
  51.     conexao.commit()
  52.     messagebox.showinfo("Sucesso", "Compromisso adicionado com sucesso!")
  53.     limpar_campos()
  54.     carregar_compromissos()
  55.  
  56. # Função para carregar compromissos
  57. def carregar_compromissos():
  58.     for item in tabela.get_children():
  59.         tabela.delete(item)
  60.  
  61.     cursor.execute("SELECT id, titulo, data, hora FROM compromissos")
  62.     for row in cursor.fetchall():
  63.         tabela.insert("", tk.END, values=row)
  64.  
  65. # Função para exibir os detalhes de um compromisso
  66. def exibir_detalhes(event):
  67.     item_selecionado = tabela.selection()
  68.     if not item_selecionado:
  69.         return
  70.  
  71.     compromisso_id = tabela.item(item_selecionado[0], "values")[0]
  72.     cursor.execute("SELECT * FROM compromissos WHERE id = ?", (compromisso_id,))
  73.     compromisso = cursor.fetchone()
  74.  
  75.     if compromisso:
  76.         janela_detalhes = tk.Toplevel()
  77.         janela_detalhes.title("Detalhes do Compromisso")
  78.         largura = 400
  79.         altura = 300
  80.         largura_tela = janela_detalhes.winfo_screenwidth()
  81.         altura_tela = janela_detalhes.winfo_screenheight()
  82.         pos_x = (largura_tela // 2) - (largura // 2)
  83.         pos_y = (altura_tela // 2) - (altura // 2)
  84.         janela_detalhes.geometry(f"{largura}x{altura}+{pos_x}+{pos_y}")
  85.  
  86.         tk.Label(janela_detalhes, text="ID:").grid(row=0, column=0, sticky="w", padx=5, pady=5)
  87.         tk.Label(janela_detalhes, text=compromisso[0]).grid(row=0, column=1, sticky="w", padx=5, pady=5)
  88.  
  89.         tk.Label(janela_detalhes, text="Título:").grid(row=1, column=0, sticky="w", padx=5, pady=5)
  90.         tk.Label(janela_detalhes, text=compromisso[1]).grid(row=1, column=1, sticky="w", padx=5, pady=5)
  91.  
  92.         tk.Label(janela_detalhes, text="Descrição:").grid(row=2, column=0, sticky="nw", padx=5, pady=5)
  93.         tk.Message(janela_detalhes, text=compromisso[2], width=300).grid(row=2, column=1, sticky="w", padx=5, pady=5)
  94.  
  95.         tk.Label(janela_detalhes, text="Data:").grid(row=3, column=0, sticky="w", padx=5, pady=5)
  96.         tk.Label(janela_detalhes, text=compromisso[3]).grid(row=3, column=1, sticky="w", padx=5, pady=5)
  97.  
  98.         tk.Label(janela_detalhes, text="Hora:").grid(row=4, column=0, sticky="w", padx=5, pady=5)
  99.         tk.Label(janela_detalhes, text=compromisso[4]).grid(row=4, column=1, sticky="w", padx=5, pady=5)
  100.  
  101.         tk.Button(janela_detalhes, text="Fechar", command=janela_detalhes.destroy).grid(row=5, column=1, pady=10, sticky="e")
  102.  
  103. # Função para remover compromisso
  104. def remover_compromisso():
  105.     item_selecionado = tabela.selection()
  106.     if not item_selecionado:
  107.         messagebox.showwarning("Aviso", "Por favor, selecione um compromisso para remover.")
  108.         return
  109.  
  110.     confirmacao = messagebox.askyesno("Confirmação", "Tem certeza de que deseja remover o compromisso selecionado?")
  111.     if confirmacao:
  112.         compromisso_id = tabela.item(item_selecionado[0], "values")[0]
  113.         cursor.execute("DELETE FROM compromissos WHERE id = ?", (compromisso_id,))
  114.         conexao.commit()
  115.         carregar_compromissos()
  116.         messagebox.showinfo("Sucesso", "Compromisso removido com sucesso.")
  117.  
  118. # Função para limpar os campos de entrada
  119. def limpar_campos():
  120.     entrada_titulo.delete(0, tk.END)
  121.     entrada_descricao.delete("1.0", tk.END)
  122.  
  123. # Interface principal
  124. janela = tk.Tk()
  125. janela.title("Agenda de Compromissos")
  126. largura = 800
  127. altura = 500
  128. largura_tela = janela.winfo_screenwidth()
  129. altura_tela = janela.winfo_screenheight()
  130. pos_x = (largura_tela // 2) - (largura // 2)
  131. pos_y = (altura_tela // 2) - (altura // 2)
  132. janela.geometry(f"{largura}x{altura}+{pos_x}+{pos_y}")
  133.  
  134. # Campos de entrada
  135. tk.Label(janela, text="Título:").grid(row=0, column=0, sticky="w", padx=5, pady=5)
  136. entrada_titulo = tk.Entry(janela, width=50)
  137. entrada_titulo.grid(row=0, column=1, padx=5, pady=5)
  138.  
  139. tk.Label(janela, text="Descrição:").grid(row=1, column=0, sticky="nw", padx=5, pady=5)
  140. entrada_descricao = tk.Text(janela, width=50, height=5)
  141. entrada_descricao.grid(row=1, column=1, padx=5, pady=5)
  142.  
  143. # Botões
  144. botao_adicionar = tk.Button(janela, text="Adicionar Compromisso", command=adicionar_compromisso)
  145. botao_adicionar.grid(row=2, column=1, sticky="w", padx=5, pady=5)
  146.  
  147. botao_remover = tk.Button(janela, text="Remover Compromisso", command=remover_compromisso)
  148. botao_remover.grid(row=3, column=1, sticky="w", padx=5, pady=5)
  149.  
  150. # Tabela de compromissos
  151. tabela = ttk.Treeview(janela, columns=("ID", "Título", "Data", "Hora"), show="headings")
  152. tabela.heading("ID", text="ID")
  153. tabela.heading("Título", text="Título")
  154. tabela.heading("Data", text="Data")
  155. tabela.heading("Hora", text="Hora")
  156. tabela.column("ID", width=30)
  157. tabela.column("Título", width=300)
  158. tabela.column("Data", width=100)
  159. tabela.column("Hora", width=70)
  160. tabela.grid(row=4, column=0, columnspan=2, pady=10, padx=5, sticky="nsew")
  161.  
  162. # Configuração do redimensionamento
  163. janela.grid_rowconfigure(4, weight=1)
  164. janela.grid_columnconfigure(1, weight=1)
  165.  
  166. # Associar evento de clique duplo para exibir detalhes
  167. tabela.bind("<Double-1>", exibir_detalhes)
  168.  
  169. # Carregar os compromissos iniciais
  170. carregar_compromissos()
  171.  
  172. # Iniciar a aplicação
  173. janela.mainloop()
  174.  
  175. # Fechar a conexão com o banco de dados quando o programa for encerrado
  176. conexao.close()
  177.  
Add Comment
Please, Sign In to add comment