· 3 months ago · Jun 15, 2025, 03:50 AM
1import tkinter as tk
2from tkinter import ttk
3from tkcalendar import Calendar
4import sqlite3
5from datetime import datetime, date
6
7
8# ---------- BANCO DE DADOS ----------
9def 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
34def 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
42def 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
51def 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
61def 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
75criar_banco()
76
77janela = tk.Tk()
78janela.title("Controle de Medicamentos")
79
80# Centralizar a janela
81largura_janela = 700
82altura_janela = 600
83
84largura_tela = janela.winfo_screenwidth()
85altura_tela = janela.winfo_screenheight()
86
87pos_x = (largura_tela // 2) - (largura_janela // 2)
88pos_y = (altura_tela // 2) - (altura_janela // 2)
89
90janela.geometry(f"{largura_janela}x{altura_janela}+{pos_x}+{pos_y}")
91janela.resizable(False, False)
92
93# ---------- Data Selecionada ----------
94data_selecionada = date.today()
95
96
97def atualizar_label_data():
98 label_data.config(text=f"Data selecionada: {data_selecionada.strftime('%d/%m/%Y')}")
99
100
101# ---------- Função Calendário ----------
102def 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 ----------
120frame_top = tk.Frame(janela)
121frame_top.pack(pady=10)
122
123label_titulo = tk.Label(frame_top, text="Controle de Medicamentos", font=("Arial", 18, "bold"))
124label_titulo.grid(row=0, column=0, columnspan=2)
125
126label_data = tk.Label(frame_top, text="", font=("Arial", 14))
127label_data.grid(row=1, column=0, pady=5)
128
129btn_data = tk.Button(frame_top, text="Escolher Data", font=("Arial", 11), command=escolher_data)
130btn_data.grid(row=1, column=1, padx=10)
131
132atualizar_label_data()
133
134# ---------- Adicionar Medicamento ----------
135frame_add = tk.Frame(janela)
136frame_add.pack(pady=10)
137
138entry_medicamento = tk.Entry(frame_add, width=40, font=("Arial", 11))
139entry_medicamento.grid(row=0, column=0, padx=5)
140
141def 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
148btn_adicionar = tk.Button(frame_add, text="Adicionar Medicamento", font=("Arial", 11), command=adicionar_click)
149btn_adicionar.grid(row=0, column=1)
150
151# ---------- Lista de Medicamentos ----------
152frame_lista = tk.Frame(janela)
153frame_lista.pack(pady=10, fill="both", expand=True)
154
155canvas = tk.Canvas(frame_lista)
156scrollbar = ttk.Scrollbar(frame_lista, orient="vertical", command=canvas.yview)
157scrollable_frame = tk.Frame(canvas)
158
159scrollable_frame.bind(
160 "<Configure>",
161 lambda e: canvas.configure(
162 scrollregion=canvas.bbox("all")
163 )
164)
165
166canvas.create_window((0, 0), window=scrollable_frame, anchor="nw")
167canvas.configure(yscrollcommand=scrollbar.set)
168
169canvas.pack(side="left", fill="both", expand=True)
170scrollbar.pack(side="right", fill="y")
171
172# ---------- Função Atualizar Lista ----------
173def 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
203atualizar_lista()
204
205# ---------- Iniciar Loop ----------
206janela.mainloop()
207