Advertisement
MizunoBrasil

Medicamentos

Jun 14th, 2025
221
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.35 KB | None | 0 0
  1. import tkinter as tk
  2. from tkinter import ttk
  3. from tkcalendar import Calendar
  4. import sqlite3
  5. from datetime import datetime, date
  6.  
  7.  
  8. # ---------- BANCO DE DADOS ----------
  9. def criar_banco():
  10.     conn = sqlite3.connect("medicamentos.db")
  11.     cursor = conn.cursor()
  12.  
  13.     cursor.execute('''
  14.        CREATE TABLE IF NOT EXISTS medicamentos (
  15.            id INTEGER PRIMARY KEY AUTOINCREMENT,
  16.            nome TEXT NOT NULL
  17.        )
  18.    ''')
  19.  
  20.     cursor.execute('''
  21.        CREATE TABLE IF NOT EXISTS historico (
  22.            id INTEGER PRIMARY KEY AUTOINCREMENT,
  23.            medicamento_id INTEGER,
  24.            data TEXT,
  25.            hora TEXT,
  26.            FOREIGN KEY(medicamento_id) REFERENCES medicamentos(id)
  27.        )
  28.    ''')
  29.  
  30.     conn.commit()
  31.     conn.close()
  32.  
  33.  
  34. def adicionar_medicamento(nome):
  35.     conn = sqlite3.connect("medicamentos.db")
  36.     cursor = conn.cursor()
  37.     cursor.execute("INSERT INTO medicamentos (nome) VALUES (?)", (nome,))
  38.     conn.commit()
  39.     conn.close()
  40.  
  41.  
  42. def listar_medicamentos():
  43.     conn = sqlite3.connect("medicamentos.db")
  44.     cursor = conn.cursor()
  45.     cursor.execute("SELECT id, nome FROM medicamentos")
  46.     dados = cursor.fetchall()
  47.     conn.close()
  48.     return dados
  49.  
  50.  
  51. def registrar_tomada(medicamento_id, data):
  52.     conn = sqlite3.connect("medicamentos.db")
  53.     cursor = conn.cursor()
  54.     hora = datetime.now().strftime('%H:%M')
  55.     cursor.execute("INSERT INTO historico (medicamento_id, data, hora) VALUES (?, ?, ?)", (medicamento_id, data, hora))
  56.     conn.commit()
  57.     conn.close()
  58.     return hora
  59.  
  60.  
  61. def buscar_historico_do_dia(medicamento_id, data):
  62.     conn = sqlite3.connect("medicamentos.db")
  63.     cursor = conn.cursor()
  64.     cursor.execute('''
  65.        SELECT hora FROM historico
  66.        WHERE medicamento_id = ? AND data = ?
  67.        ORDER BY id ASC
  68.    ''', (medicamento_id, data))
  69.     resultados = cursor.fetchall()
  70.     conn.close()
  71.     return [r[0] for r in resultados] if resultados else []
  72.  
  73. # ---------- INTERFACE TKINTER ----------
  74.  
  75. criar_banco()
  76.  
  77. janela = tk.Tk()
  78. janela.title("Controle de Medicamentos")
  79.  
  80. # Centralizar a janela
  81. largura_janela = 700
  82. altura_janela = 600
  83.  
  84. largura_tela = janela.winfo_screenwidth()
  85. altura_tela = janela.winfo_screenheight()
  86.  
  87. pos_x = (largura_tela // 2) - (largura_janela // 2)
  88. pos_y = (altura_tela // 2) - (altura_janela // 2)
  89.  
  90. janela.geometry(f"{largura_janela}x{altura_janela}+{pos_x}+{pos_y}")
  91. janela.resizable(False, False)
  92.  
  93. # ---------- Data Selecionada ----------
  94. data_selecionada = date.today()
  95.  
  96.  
  97. def atualizar_label_data():
  98.     label_data.config(text=f"Data selecionada: {data_selecionada.strftime('%d/%m/%Y')}")
  99.  
  100.  
  101. # ---------- Função Calendário ----------
  102. def escolher_data():
  103.     def confirmar():
  104.         global data_selecionada
  105.         data_selecionada = cal.selection_get()
  106.         atualizar_label_data()
  107.         atualizar_lista()
  108.         top.destroy()
  109.  
  110.     top = tk.Toplevel(janela)
  111.     top.title("Escolher Data")
  112.     cal = Calendar(top, selectmode='day', year=data_selecionada.year, month=data_selecionada.month, day=data_selecionada.day)
  113.     cal.pack(pady=20)
  114.  
  115.     btn_ok = tk.Button(top, text="Confirmar", font=("Arial", 11), command=confirmar)
  116.     btn_ok.pack(pady=10)
  117.  
  118.  
  119. # ---------- Widgets ----------
  120. frame_top = tk.Frame(janela)
  121. frame_top.pack(pady=10)
  122.  
  123. label_titulo = tk.Label(frame_top, text="Controle de Medicamentos", font=("Arial", 18, "bold"))
  124. label_titulo.grid(row=0, column=0, columnspan=2)
  125.  
  126. label_data = tk.Label(frame_top, text="", font=("Arial", 14))
  127. label_data.grid(row=1, column=0, pady=5)
  128.  
  129. btn_data = tk.Button(frame_top, text="Escolher Data", font=("Arial", 11), command=escolher_data)
  130. btn_data.grid(row=1, column=1, padx=10)
  131.  
  132. atualizar_label_data()
  133.  
  134. # ---------- Adicionar Medicamento ----------
  135. frame_add = tk.Frame(janela)
  136. frame_add.pack(pady=10)
  137.  
  138. entry_medicamento = tk.Entry(frame_add, width=40, font=("Arial", 11))
  139. entry_medicamento.grid(row=0, column=0, padx=5)
  140.  
  141. def adicionar_click():
  142.     nome = entry_medicamento.get().strip()
  143.     if nome:
  144.         adicionar_medicamento(nome)
  145.         entry_medicamento.delete(0, tk.END)
  146.         atualizar_lista()
  147.  
  148. btn_adicionar = tk.Button(frame_add, text="Adicionar Medicamento", font=("Arial", 11), command=adicionar_click)
  149. btn_adicionar.grid(row=0, column=1)
  150.  
  151. # ---------- Lista de Medicamentos ----------
  152. frame_lista = tk.Frame(janela)
  153. frame_lista.pack(pady=10, fill="both", expand=True)
  154.  
  155. canvas = tk.Canvas(frame_lista)
  156. scrollbar = ttk.Scrollbar(frame_lista, orient="vertical", command=canvas.yview)
  157. scrollable_frame = tk.Frame(canvas)
  158.  
  159. scrollable_frame.bind(
  160.     "<Configure>",
  161.     lambda e: canvas.configure(
  162.         scrollregion=canvas.bbox("all")
  163.     )
  164. )
  165.  
  166. canvas.create_window((0, 0), window=scrollable_frame, anchor="nw")
  167. canvas.configure(yscrollcommand=scrollbar.set)
  168.  
  169. canvas.pack(side="left", fill="both", expand=True)
  170. scrollbar.pack(side="right", fill="y")
  171.  
  172. # ---------- Função Atualizar Lista ----------
  173. def atualizar_lista():
  174.     for widget in scrollable_frame.winfo_children():
  175.         widget.destroy()
  176.  
  177.     medicamentos = listar_medicamentos()
  178.  
  179.     for id_medic, nome in medicamentos:
  180.         horarios = buscar_historico_do_dia(id_medic, data_selecionada.strftime('%Y-%m-%d'))
  181.         texto_horarios = ", ".join(horarios) if horarios else "Ainda não tomado"
  182.  
  183.         frame_item = tk.Frame(scrollable_frame, bd=1, relief="solid", padx=5, pady=5)
  184.         frame_item.pack(fill="x", pady=2, padx=2)
  185.  
  186.         label_nome = tk.Label(frame_item, text=nome, width=25, anchor="w", font=("Arial", 12, "bold"))
  187.         label_nome.grid(row=0, column=0)
  188.  
  189.         label_horario = tk.Label(frame_item, text=texto_horarios, width=30, anchor="w", font=("Arial", 11))
  190.         label_horario.grid(row=0, column=1)
  191.  
  192.         def gerar_callback(id_medicamento, label):
  193.             def on_click():
  194.                 registrar_tomada(id_medicamento, data_selecionada.strftime('%Y-%m-%d'))
  195.                 horarios_atualizados = buscar_historico_do_dia(id_medicamento, data_selecionada.strftime('%Y-%m-%d'))
  196.                 label.config(text=", ".join(horarios_atualizados))
  197.             return on_click
  198.  
  199.         btn_tomar = tk.Button(frame_item, text="Tomar", font=("Arial", 11), command=gerar_callback(id_medic, label_horario))
  200.         btn_tomar.grid(row=0, column=2, padx=5)
  201.  
  202.  
  203. atualizar_lista()
  204.  
  205. # ---------- Iniciar Loop ----------
  206. janela.mainloop()
  207.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement