Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import sqlite3
- import tkinter as tk
- from tkinter import messagebox, ttk, filedialog
- import re
- import shutil
- import os
- import sys
- # 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()
- 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
- 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
- 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()
- 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)
- 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 = 600
- altura = 400
- 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="Título:", font=("Arial", 10, "bold")).grid(row=0, column=0, sticky="w", padx=10, pady=5)
- entrada_titulo_editar = tk.Entry(janela_detalhes, width=70, font=("Arial", 10))
- entrada_titulo_editar.insert(0, compromisso[1])
- entrada_titulo_editar.grid(row=0, column=1, padx=10, pady=5, sticky="w")
- tk.Label(janela_detalhes, text="Descrição:", font=("Arial", 10, "bold")).grid(row=1, column=0, sticky="nw", padx=10, pady=5)
- entrada_descricao_editar = tk.Text(janela_detalhes, width=70, height=10, font=("Arial", 10))
- entrada_descricao_editar.insert("1.0", compromisso[2])
- entrada_descricao_editar.grid(row=1, column=1, padx=10, pady=5, sticky="w")
- tk.Label(janela_detalhes, text="Data:", font=("Arial", 10, "bold")).grid(row=2, column=0, sticky="w", padx=10, pady=5)
- tk.Label(janela_detalhes, text=compromisso[3], font=("Arial", 10)).grid(row=2, column=1, sticky="w", padx=10, pady=5)
- tk.Label(janela_detalhes, text="Hora:", font=("Arial", 10, "bold")).grid(row=3, column=0, sticky="w", padx=10, pady=5)
- tk.Label(janela_detalhes, text=compromisso[4], font=("Arial", 10)).grid(row=3, column=1, sticky="w", padx=10, pady=5)
- def salvar_edicao():
- novo_titulo = entrada_titulo_editar.get()
- nova_descricao = entrada_descricao_editar.get("1.0", tk.END).strip()
- if not novo_titulo or not nova_descricao:
- messagebox.showerror("Erro", "Todos os campos devem ser preenchidos.")
- return
- nova_data, nova_hora = extrair_data_hora(nova_descricao)
- if not nova_data or not nova_hora:
- return
- cursor.execute("UPDATE compromissos SET titulo = ?, descricao = ?, data = ?, hora = ? WHERE id = ?",
- (novo_titulo, nova_descricao, nova_data, nova_hora, compromisso[0]))
- conexao.commit()
- messagebox.showinfo("Sucesso", "Compromisso atualizado com sucesso!")
- carregar_compromissos()
- janela_detalhes.destroy()
- botoes_frame = tk.Frame(janela_detalhes)
- botoes_frame.grid(row=4, column=0, columnspan=2, pady=15)
- botao_salvar = tk.Button(botoes_frame, text="Salvar", command=salvar_edicao, width=12, bg="lightblue", font=("Arial", 10, "bold"))
- botao_salvar.pack(side="left", padx=10)
- botao_fechar = tk.Button(botoes_frame, text="Fechar", command=janela_detalhes.destroy, width=12, bg="lightgrey", font=("Arial", 10))
- botao_fechar.pack(side="left", padx=10)
- def exportar_para_html():
- cursor.execute("SELECT titulo, descricao, data, hora FROM compromissos")
- compromissos = cursor.fetchall()
- html_content = """
- <!DOCTYPE html>
- <html lang="pt-BR">
- <head>
- <meta charset="UTF-8">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>Compromissos</title>
- <style>
- body {
- font-family: Arial, sans-serif;
- background-color: #f4f4f9;
- padding: 20px;
- }
- h1 {
- text-align: center;
- }
- table {
- width: 100%;
- border-collapse: collapse;
- }
- th, td {
- padding: 10px;
- border: 1px solid #ddd;
- text-align: left;
- }
- th {
- background-color: #007bff;
- color: white;
- }
- tr:nth-child(even) {
- background-color: #f2f2f2;
- }
- </style>
- </head>
- <body>
- <h1>Lista de Compromissos</h1>
- <table>
- <tr>
- <th>Título</th>
- <th>Descrição</th>
- <th>Data</th>
- <th>Hora</th>
- </tr>
- """
- for compromisso in compromissos:
- html_content += f"""
- <tr>
- <td>{compromisso[0]}</td>
- <td>{compromisso[1]}</td>
- <td>{compromisso[2]}</td>
- <td>{compromisso[3]}</td>
- </tr>
- """
- html_content += """
- </table>
- </body>
- </html>
- """
- with open("compromissos.html", "w", encoding="utf-8") as f:
- f.write(html_content)
- messagebox.showinfo("Sucesso", "Compromissos exportados para 'compromissos.html'.")
- 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.")
- def limpar_campos():
- entrada_titulo.delete(0, tk.END)
- entrada_descricao.delete("1.0", tk.END)
- def fazer_backup():
- destino = filedialog.asksaveasfilename(defaultextension=".db", filetypes=[("SQLite Database", "*.db")])
- if destino:
- shutil.copy("agenda.db", destino)
- messagebox.showinfo("Sucesso", f"Backup realizado com sucesso em: {destino}")
- def restaurar_backup():
- origem = filedialog.askopenfilename(filetypes=[("SQLite Database", "*.db")])
- if origem and messagebox.askyesno("Confirmação", "Tem certeza de que deseja restaurar este backup? Isso substituirá os dados atuais."):
- conexao.close()
- os.remove("agenda.db")
- shutil.copy(origem, "agenda.db")
- messagebox.showinfo("Sucesso", "Backup restaurado com sucesso!")
- os.execl(sys.executable, sys.executable, *sys.argv) # Reiniciar a aplicação
- janela = tk.Tk()
- janela.title("Lista 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}")
- tk.Label(janela, text="Título:", font=("Arial", 10, "bold")).grid(row=0, column=0, sticky="w", padx=5, pady=5)
- entrada_titulo = tk.Entry(janela, width=70, font=("Arial", 10))
- entrada_titulo.grid(row=0, column=1, padx=5, pady=5, sticky="w")
- tk.Label(janela, text="Descrição:", font=("Arial", 10, "bold")).grid(row=1, column=0, sticky="nw", padx=5, pady=5)
- entrada_descricao = tk.Text(janela, width=70, height=5, font=("Arial", 10))
- entrada_descricao.grid(row=1, column=1, padx=5, pady=5)
- botoes_frame_principal = tk.Frame(janela)
- botoes_frame_principal.grid(row=2, column=1, pady=10, sticky="w")
- botao_adicionar = tk.Button(botoes_frame_principal, text="Adicionar", command=adicionar_compromisso, width=12, bg="lightblue", font=("Arial", 10, "bold"))
- botao_adicionar.pack(side="left", padx=5)
- botao_remover = tk.Button(botoes_frame_principal, text="Remover", command=remover_compromisso, width=12, bg="lightcoral", font=("Arial", 10, "bold"))
- botao_remover.pack(side="left", padx=5)
- botao_exportar = tk.Button(botoes_frame_principal, text="Exportar HTML", command=exportar_para_html, width=12, bg="lightgreen", font=("Arial", 10, "bold"))
- botao_exportar.pack(side="left", padx=5)
- botao_backup = tk.Button(botoes_frame_principal, text="Backup", command=fazer_backup, width=12, bg="lightyellow", font=("Arial", 10, "bold"))
- botao_backup.pack(side="left", padx=5)
- botao_restaurar = tk.Button(botoes_frame_principal, text="Restaurar", command=restaurar_backup, width=12, bg="lightpink", font=("Arial", 10, "bold"))
- botao_restaurar.pack(side="left", padx=5)
- 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=3, column=0, columnspan=2, pady=10, padx=5, sticky="nsew")
- janela.grid_rowconfigure(3, weight=1)
- janela.grid_columnconfigure(1, weight=1)
- tabela.bind("<Double-1>", exibir_detalhes)
- carregar_compromissos()
- janela.mainloop()
- conexao.close()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement