Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import tkinter as tk
- from tkinter import ttk
- from tkcalendar import Calendar
- import sqlite3
- from datetime import datetime, date
- # ---------- BANCO DE DADOS ----------
- def criar_banco():
- conn = sqlite3.connect("medicamentos.db")
- cursor = conn.cursor()
- cursor.execute('''
- CREATE TABLE IF NOT EXISTS medicamentos (
- id INTEGER PRIMARY KEY AUTOINCREMENT,
- nome TEXT NOT NULL
- )
- ''')
- cursor.execute('''
- CREATE TABLE IF NOT EXISTS historico (
- id INTEGER PRIMARY KEY AUTOINCREMENT,
- medicamento_id INTEGER,
- data TEXT,
- hora TEXT,
- FOREIGN KEY(medicamento_id) REFERENCES medicamentos(id)
- )
- ''')
- conn.commit()
- conn.close()
- def adicionar_medicamento(nome):
- conn = sqlite3.connect("medicamentos.db")
- cursor = conn.cursor()
- cursor.execute("INSERT INTO medicamentos (nome) VALUES (?)", (nome,))
- conn.commit()
- conn.close()
- def listar_medicamentos():
- conn = sqlite3.connect("medicamentos.db")
- cursor = conn.cursor()
- cursor.execute("SELECT id, nome FROM medicamentos")
- dados = cursor.fetchall()
- conn.close()
- return dados
- def registrar_tomada(medicamento_id, data):
- conn = sqlite3.connect("medicamentos.db")
- cursor = conn.cursor()
- hora = datetime.now().strftime('%H:%M')
- cursor.execute("INSERT INTO historico (medicamento_id, data, hora) VALUES (?, ?, ?)", (medicamento_id, data, hora))
- conn.commit()
- conn.close()
- return hora
- def buscar_historico_do_dia(medicamento_id, data):
- conn = sqlite3.connect("medicamentos.db")
- cursor = conn.cursor()
- cursor.execute('''
- SELECT hora FROM historico
- WHERE medicamento_id = ? AND data = ?
- ORDER BY id ASC
- ''', (medicamento_id, data))
- resultados = cursor.fetchall()
- conn.close()
- return [r[0] for r in resultados] if resultados else []
- # ---------- INTERFACE TKINTER ----------
- criar_banco()
- janela = tk.Tk()
- janela.title("Controle de Medicamentos")
- # Centralizar a janela
- largura_janela = 700
- altura_janela = 600
- largura_tela = janela.winfo_screenwidth()
- altura_tela = janela.winfo_screenheight()
- pos_x = (largura_tela // 2) - (largura_janela // 2)
- pos_y = (altura_tela // 2) - (altura_janela // 2)
- janela.geometry(f"{largura_janela}x{altura_janela}+{pos_x}+{pos_y}")
- janela.resizable(False, False)
- # ---------- Data Selecionada ----------
- data_selecionada = date.today()
- def atualizar_label_data():
- label_data.config(text=f"Data selecionada: {data_selecionada.strftime('%d/%m/%Y')}")
- # ---------- Função Calendário ----------
- def escolher_data():
- def confirmar():
- global data_selecionada
- data_selecionada = cal.selection_get()
- atualizar_label_data()
- atualizar_lista()
- top.destroy()
- top = tk.Toplevel(janela)
- top.title("Escolher Data")
- cal = Calendar(top, selectmode='day', year=data_selecionada.year, month=data_selecionada.month, day=data_selecionada.day)
- cal.pack(pady=20)
- btn_ok = tk.Button(top, text="Confirmar", font=("Arial", 11), command=confirmar)
- btn_ok.pack(pady=10)
- # ---------- Widgets ----------
- frame_top = tk.Frame(janela)
- frame_top.pack(pady=10)
- label_titulo = tk.Label(frame_top, text="Controle de Medicamentos", font=("Arial", 18, "bold"))
- label_titulo.grid(row=0, column=0, columnspan=2)
- label_data = tk.Label(frame_top, text="", font=("Arial", 14))
- label_data.grid(row=1, column=0, pady=5)
- btn_data = tk.Button(frame_top, text="Escolher Data", font=("Arial", 11), command=escolher_data)
- btn_data.grid(row=1, column=1, padx=10)
- atualizar_label_data()
- # ---------- Adicionar Medicamento ----------
- frame_add = tk.Frame(janela)
- frame_add.pack(pady=10)
- entry_medicamento = tk.Entry(frame_add, width=40, font=("Arial", 11))
- entry_medicamento.grid(row=0, column=0, padx=5)
- def adicionar_click():
- nome = entry_medicamento.get().strip()
- if nome:
- adicionar_medicamento(nome)
- entry_medicamento.delete(0, tk.END)
- atualizar_lista()
- btn_adicionar = tk.Button(frame_add, text="Adicionar Medicamento", font=("Arial", 11), command=adicionar_click)
- btn_adicionar.grid(row=0, column=1)
- # ---------- Lista de Medicamentos ----------
- frame_lista = tk.Frame(janela)
- frame_lista.pack(pady=10, fill="both", expand=True)
- canvas = tk.Canvas(frame_lista)
- scrollbar = ttk.Scrollbar(frame_lista, orient="vertical", command=canvas.yview)
- scrollable_frame = tk.Frame(canvas)
- scrollable_frame.bind(
- "<Configure>",
- lambda e: canvas.configure(
- scrollregion=canvas.bbox("all")
- )
- )
- canvas.create_window((0, 0), window=scrollable_frame, anchor="nw")
- canvas.configure(yscrollcommand=scrollbar.set)
- canvas.pack(side="left", fill="both", expand=True)
- scrollbar.pack(side="right", fill="y")
- # ---------- Função Atualizar Lista ----------
- def atualizar_lista():
- for widget in scrollable_frame.winfo_children():
- widget.destroy()
- medicamentos = listar_medicamentos()
- for id_medic, nome in medicamentos:
- horarios = buscar_historico_do_dia(id_medic, data_selecionada.strftime('%Y-%m-%d'))
- texto_horarios = ", ".join(horarios) if horarios else "Ainda não tomado"
- frame_item = tk.Frame(scrollable_frame, bd=1, relief="solid", padx=5, pady=5)
- frame_item.pack(fill="x", pady=2, padx=2)
- label_nome = tk.Label(frame_item, text=nome, width=25, anchor="w", font=("Arial", 12, "bold"))
- label_nome.grid(row=0, column=0)
- label_horario = tk.Label(frame_item, text=texto_horarios, width=30, anchor="w", font=("Arial", 11))
- label_horario.grid(row=0, column=1)
- def gerar_callback(id_medicamento, label):
- def on_click():
- registrar_tomada(id_medicamento, data_selecionada.strftime('%Y-%m-%d'))
- horarios_atualizados = buscar_historico_do_dia(id_medicamento, data_selecionada.strftime('%Y-%m-%d'))
- label.config(text=", ".join(horarios_atualizados))
- return on_click
- btn_tomar = tk.Button(frame_item, text="Tomar", font=("Arial", 11), command=gerar_callback(id_medic, label_horario))
- btn_tomar.grid(row=0, column=2, padx=5)
- atualizar_lista()
- # ---------- Iniciar Loop ----------
- janela.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement