Mundo em Python

Calcular calorias diárias (usando CRUD, usando tkinter)

from tkinter import *
import tkinter.ttk as ttk
import tkinter.messagebox as tkMessageBox
import sqlite3
from datetime import date
import matplotlib.pyplot as plt
def Database():
global conn, cursor
conn = sqlite3.connect("calorias.db")
cursor = conn.cursor()
cursor.execute(
"CREATE TABLE IF NOT EXISTS REGISTRATION (RID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"
" DESCRICAO TEXT, DATA TEXT, QUANTIDADE REAL)")
conn.commit()
def DisplayForm():
global tree, SEARCH, descrição, data, quantidade, lbl_total_calorias root = Tk()
root.geometry("900x600")
root.title("Calcular as Calorias") SEARCH = StringVar()
descrição = StringVar()
data = StringVar(value=date.today().strftime("%Y-%m-%d")) # Data atual no formato YYYY-MM-DD
quantidade = DoubleVar() TopViewForm = Frame(root, width=600, bd=1, relief=SOLID)
TopViewForm.pack(side=TOP, fill=X)
LFrom = Frame(root, width="350", bg="#15244C")
LFrom.pack(side=LEFT, fill=Y)
LeftViewForm = Frame(root, width=500, bg="#0B4670")
LeftViewForm.pack(side=LEFT, fill=Y)
MidViewForm = Frame(root, width=600)
MidViewForm.pack(side=RIGHT) lbl_text = Label(TopViewForm,
text="Calcular as Calorias",
font=('verdana', 18), width=600, bg="cyan")
lbl_text.pack(fill=X) Label(LFrom, text="Descrição ", font=("Arial", 12),
bg="#15244C", fg="white").pack(side=TOP)
Entry(LFrom, font=("Arial", 10, "bold"),
textvariable=descrição).pack(side=TOP, padx=10, fill=X) Label(LFrom, text="Data ", font=("Arial", 12),
bg="#15244C", fg="white").pack(side=TOP)
Entry(LFrom, font=("Arial", 10, "bold"),
textvariable=data).pack(side=TOP, padx=10, fill=X) Label(LFrom, text="Quantidade ",
font=("Arial", 12), bg="#15244C", fg="white").pack(side=TOP)
Entry(LFrom, font=("Arial", 10, "bold"),
textvariable=quantidade).pack(side=TOP, padx=10, fill=X) # Botão para submeter o registro
Button(LFrom, text="Submeter", font=("Arial", 10, "bold"),
bg="cyan", command=register).pack(side=TOP, padx=10, pady=5, fill=X) lbl_txtsearch = Label(LeftViewForm, text="Data (YYYY-MM-DD)",
font=('verdana', 10), bg="#0B4670")
lbl_txtsearch.pack()
Entry(LeftViewForm, textvariable=SEARCH,
font=('verdana', 15), width=10).pack(side=TOP, padx=10, fill=X) Button(LeftViewForm, text="Pesquisa", bg="cyan",
command=SearchRecord).pack(side=TOP, padx=10, pady=10, fill=X)
Button(LeftViewForm, text="Ver tudo", bg="cyan",
command=DisplayData).pack(side=TOP, padx=10, pady=10, fill=X)
Button(LeftViewForm, text="Limpar", bg="cyan",
command=limpar).pack(side=TOP, padx=10, pady=10, fill=X)
Button(LeftViewForm, text="Apagar", bg="cyan",
command=apagar).pack(side=TOP, padx=10, pady=10, fill=X)
Button(LeftViewForm, text="Atualizar", bg="cyan",
command=actualizacao).pack(side=TOP, padx=10, pady=10, fill=X)
Button(LeftViewForm, text="Ver Gráfico", bg="cyan",
command=visualizar_grafico).pack(side=TOP, padx=10, pady=10, fill=X) scrollbarx = Scrollbar(MidViewForm, orient=HORIZONTAL)
scrollbary = Scrollbar(MidViewForm, orient=VERTICAL) tree = ttk.Treeview(MidViewForm, columns=("RID", "Descrição", "Data", "Quantidade"),
selectmode="extended", height=100,
yscrollcommand=scrollbary.set, xscrollcommand=scrollbarx.set) scrollbary.config(command=tree.yview)
scrollbary.pack(side=RIGHT, fill=Y) scrollbarx.config(command=tree.xview)
scrollbarx.pack(side=BOTTOM, fill=X) tree.heading('RID', text="ID", anchor=W)
tree.heading('Descrição', text="Descrição", anchor=W)
tree.heading('Data', text="Data", anchor=W)
tree.heading('Quantidade', text="Quantidade", anchor=W) tree.column('#0', stretch=NO, minwidth=0, width=0)
tree.column('#1', stretch=NO, minwidth=0, width=50)
tree.column('#2', stretch=NO, minwidth=0, width=100)
tree.column('#3', stretch=NO, minwidth=0, width=150)
tree.column('#4', stretch=NO, minwidth=0, width=100) tree.pack()
tree.bind("<Double-1>", OnDoubleClick) lbl_total_calorias = Label(TopViewForm,
text="Total Hoje Calorias Consumidas: ",
font=('verdana', 12), bg="cyan")
lbl_total_calorias.pack(side=LEFT, padx=10) DisplayData() root.mainloop()
def register():
Database()
vdescricao = descrição.get()
vdata = data.get()
vquantidade = quantidade.get() if vdescricao == '' or vdata == "" or vquantidade == 0:
tkMessageBox.showinfo("Atenção", "Preencha os espaços vazios!!!")
else:
conn.execute('INSERT INTO REGISTRATION (DESCRICAO, DATA, QUANTIDADE) VALUES (?, ?, ?)',
(vdescricao, vdata, vquantidade))
conn.commit()
tkMessageBox.showinfo("Sucesso", "Registro adicionado com sucesso")
DisplayData()
conn.close()
def DisplayData():
Database()
tree.delete(*tree.get_children())
cursor = conn.execute("SELECT * FROM REGISTRATION")
total_calorias = 0.0
hoje = date.today().strftime("%Y-%m-%d") for row in cursor.fetchall():
tree.insert('', 'end', values=row)
if row[2] == hoje:
total_calorias += row[3] lbl_total_calorias.config(text=f"Total Hoje Calorias Consumidas: {total_calorias:.2f}")
cursor.close()
conn.close()
def OnDoubleClick(event):
curItem = tree.focus()
contents = (tree.item(curItem))
selecteditem = contents['values']
descrição.set(selecteditem[1])
data.set(selecteditem[2])
quantidade.set(selecteditem[3])
def SearchRecord():
Database()
search_date = SEARCH.get()
if search_date != "":
tree.delete(*tree.get_children())
cursor = conn.execute("SELECT * FROM REGISTRATION WHERE DATA = ?", (search_date,))
for row in cursor.fetchall():
tree.insert('', 'end', values=row)
cursor.close()
conn.close()
def actualizacao():
Database()
vdescricao = descrição.get()
vdata = data.get()
vquantidade = quantidade.get() if vdescricao == '' or vdata == '' or vquantidade == 0:
tkMessageBox.showinfo("Atenção", "Preencha todos os espaços!!!")
else:
curItem = tree.focus()
contents = (tree.item(curItem))
selecteditem = contents['values']
conn.execute('UPDATE REGISTRATION SET DESCRICAO=?, DATA=?, QUANTIDADE=? WHERE RID = ?',
(vdescricao, vdata, vquantidade, selecteditem[0]))
conn.commit()
tkMessageBox.showinfo("Mensagem", "Atualizado com sucesso")
limpar()
DisplayData()
conn.close()
def apagar():
Database()
if not tree.selection():
tkMessageBox.showwarning("Atenção", "Selecione o registro a ser apagado")
else:
result = tkMessageBox.askquestion('Confirmar',
'Deseja apagar o registro selecionado?',
icon="warning")
if result == 'yes':
curItem = tree.focus()
contents = (tree.item(curItem))
selecteditem = contents['values']
tree.delete(curItem)
conn.execute("DELETE FROM REGISTRATION WHERE RID = ?", (selecteditem[0],))
conn.commit()
tkMessageBox.showinfo("Sucesso", "Registro apagado com sucesso")
conn.close()
def limpar():
tree.delete(*tree.get_children())
DisplayData()
SEARCH.set("")
descrição.set("")
data.set(date.today().strftime("%Y-%m-%d"))
quantidade.set(0.0)
def visualizar_grafico():
Database()
cursor = conn.execute("SELECT DATA, SUM(QUANTIDADE) FROM REGISTRATION GROUP BY DATA")
datas = []
quantidades = []
for row in cursor.fetchall():
datas.append(row[0])
quantidades.append(row[1])
cursor.close()
conn.close() plt.figure(figsize=(10, 5))
plt.plot(datas, quantidades, marker='o')
plt.xlabel('Data')
plt.ylabel('Quantidade de Calorias')
plt.title('Calorias Consumidas ao Longo do Tempo')
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
if __name__ == '__main__':
Database()
DisplayForm()
0