Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import sqlite3
- import tkinter as tk
- from tkinter import messagebox, ttk
- from datetime import datetime
- import re
- # Conectar ao banco de dados SQLite
- conexao = sqlite3.connect("agenda.db")
- cursor = conexao.cursor()
- # Criar a tabela se ela não existir
- cursor.execute('''
- CREATE TABLE IF NOT EXISTS compromissos (
- id INTEGER PRIMARY KEY AUTOINCREMENT,
- titulo TEXT NOT NULL,
- descricao TEXT,
- data TEXT NOT NULL,
- hora TEXT NOT NULL
- )
- ''')
- conexao.commit()
- # Função para extrair a data e hora da descrição usando regex
- def extrair_data_hora(descricao):
- padrao_data = re.search(r'\b(\d{2}/\d{2}/\d{4})\b', descricao)
- padrao_hora = re.search(r'\b(\d{2}:\d{2})\b', descricao)
- if not padrao_data or not padrao_hora:
- 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.")
- return None, None
- data = padrao_data.group(0)
- hora = padrao_hora.group(0)
- return data, hora
- # Função para adicionar compromisso
- def adicionar_compromisso():
- titulo = entrada_titulo.get()
- descricao = entrada_descricao.get("1.0", tk.END).strip()
- if not titulo or not descricao:
- messagebox.showerror("Erro", "Por favor, preencha todos os campos obrigatórios.")
- return
- data_compromisso, hora_compromisso = extrair_data_hora(descricao)
- if not data_compromisso or not hora_compromisso:
- return # Interrompe se não tiver data ou hora válidas
- cursor.execute("INSERT INTO compromissos (titulo, descricao, data, hora) VALUES (?, ?, ?, ?)",
- (titulo, descricao, data_compromisso, hora_compromisso))
- conexao.commit()
- messagebox.showinfo("Sucesso", "Compromisso adicionado com sucesso!")
- limpar_campos()
- carregar_compromissos()
- # Função para carregar compromissos
- def carregar_compromissos():
- for item in tabela.get_children():
- tabela.delete(item)
- cursor.execute("SELECT id, titulo, data, hora FROM compromissos")
- for row in cursor.fetchall():
- tabela.insert("", tk.END, values=row)
- # Função para exibir os detalhes de um compromisso
- def exibir_detalhes(event):
- item_selecionado = tabela.selection()
- if not item_selecionado:
- return
- compromisso_id = tabela.item(item_selecionado[0], "values")[0]
- cursor.execute("SELECT * FROM compromissos WHERE id = ?", (compromisso_id,))
- compromisso = cursor.fetchone()
- if compromisso:
- janela_detalhes = tk.Toplevel()
- janela_detalhes.title("Detalhes do Compromisso")
- largura = 400
- altura = 300
- largura_tela = janela_detalhes.winfo_screenwidth()
- altura_tela = janela_detalhes.winfo_screenheight()
- pos_x = (largura_tela // 2) - (largura // 2)
- pos_y = (altura_tela // 2) - (altura // 2)
- janela_detalhes.geometry(f"{largura}x{altura}+{pos_x}+{pos_y}")
- tk.Label(janela_detalhes, text="ID:").grid(row=0, column=0, sticky="w", padx=5, pady=5)
- tk.Label(janela_detalhes, text=compromisso[0]).grid(row=0, column=1, sticky="w", padx=5, pady=5)
- tk.Label(janela_detalhes, text="Título:").grid(row=1, column=0, sticky="w", padx=5, pady=5)
- tk.Label(janela_detalhes, text=compromisso[1]).grid(row=1, column=1, sticky="w", padx=5, pady=5)
- tk.Label(janela_detalhes, text="Descrição:").grid(row=2, column=0, sticky="nw", padx=5, pady=5)
- tk.Message(janela_detalhes, text=compromisso[2], width=300).grid(row=2, column=1, sticky="w", padx=5, pady=5)
- tk.Label(janela_detalhes, text="Data:").grid(row=3, column=0, sticky="w", padx=5, pady=5)
- tk.Label(janela_detalhes, text=compromisso[3]).grid(row=3, column=1, sticky="w", padx=5, pady=5)
- tk.Label(janela_detalhes, text="Hora:").grid(row=4, column=0, sticky="w", padx=5, pady=5)
- tk.Label(janela_detalhes, text=compromisso[4]).grid(row=4, column=1, sticky="w", padx=5, pady=5)
- tk.Button(janela_detalhes, text="Fechar", command=janela_detalhes.destroy).grid(row=5, column=1, pady=10, sticky="e")
- # Função para remover compromisso
- def remover_compromisso():
- item_selecionado = tabela.selection()
- if not item_selecionado:
- messagebox.showwarning("Aviso", "Por favor, selecione um compromisso para remover.")
- return
- confirmacao = messagebox.askyesno("Confirmação", "Tem certeza de que deseja remover o compromisso selecionado?")
- if confirmacao:
- compromisso_id = tabela.item(item_selecionado[0], "values")[0]
- cursor.execute("DELETE FROM compromissos WHERE id = ?", (compromisso_id,))
- conexao.commit()
- carregar_compromissos()
- messagebox.showinfo("Sucesso", "Compromisso removido com sucesso.")
- # Função para limpar os campos de entrada
- def limpar_campos():
- entrada_titulo.delete(0, tk.END)
- entrada_descricao.delete("1.0", tk.END)
- # Interface principal
- janela = tk.Tk()
- janela.title("Agenda de Compromissos")
- largura = 800
- altura = 500
- largura_tela = janela.winfo_screenwidth()
- altura_tela = janela.winfo_screenheight()
- pos_x = (largura_tela // 2) - (largura // 2)
- pos_y = (altura_tela // 2) - (altura // 2)
- janela.geometry(f"{largura}x{altura}+{pos_x}+{pos_y}")
- # Campos de entrada
- tk.Label(janela, text="Título:").grid(row=0, column=0, sticky="w", padx=5, pady=5)
- entrada_titulo = tk.Entry(janela, width=50)
- entrada_titulo.grid(row=0, column=1, padx=5, pady=5)
- tk.Label(janela, text="Descrição:").grid(row=1, column=0, sticky="nw", padx=5, pady=5)
- entrada_descricao = tk.Text(janela, width=50, height=5)
- entrada_descricao.grid(row=1, column=1, padx=5, pady=5)
- # Botões
- botao_adicionar = tk.Button(janela, text="Adicionar Compromisso", command=adicionar_compromisso)
- botao_adicionar.grid(row=2, column=1, sticky="w", padx=5, pady=5)
- botao_remover = tk.Button(janela, text="Remover Compromisso", command=remover_compromisso)
- botao_remover.grid(row=3, column=1, sticky="w", padx=5, pady=5)
- # Tabela de compromissos
- tabela = ttk.Treeview(janela, columns=("ID", "Título", "Data", "Hora"), show="headings")
- tabela.heading("ID", text="ID")
- tabela.heading("Título", text="Título")
- tabela.heading("Data", text="Data")
- tabela.heading("Hora", text="Hora")
- tabela.column("ID", width=30)
- tabela.column("Título", width=300)
- tabela.column("Data", width=100)
- tabela.column("Hora", width=70)
- tabela.grid(row=4, column=0, columnspan=2, pady=10, padx=5, sticky="nsew")
- # Configuração do redimensionamento
- janela.grid_rowconfigure(4, weight=1)
- janela.grid_columnconfigure(1, weight=1)
- # Associar evento de clique duplo para exibir detalhes
- tabela.bind("<Double-1>", exibir_detalhes)
- # Carregar os compromissos iniciais
- carregar_compromissos()
- # Iniciar a aplicação
- janela.mainloop()
- # Fechar a conexão com o banco de dados quando o programa for encerrado
- conexao.close()
Add Comment
Please, Sign In to add comment