from tkinter import *
import tkinter.ttk as ttk
import tkinter.messagebox as tkMessageBox
import sqlite3
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
def Database():
global conn, cursor
conn = sqlite3.connect("saldo.db")
cursor = conn.cursor()
cursor.execute(
"CREATE TABLE IF NOT EXISTS REGISTRATION (RID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, DESCRICAO TEXT, DATA TEXT, OPCAO TEXT, AMOUNT REAL)")
try:
cursor.execute("ALTER TABLE REGISTRATION ADD COLUMN AMOUNT REAL")
except sqlite3.OperationalError:
# Column already exists, no need to add it
pass
conn.commit()
def DisplayForm():
global lbl_total_receita, lbl_total_despesa, lbl_saldo, canvas, ax
root = Tk()
root.geometry("900x600")
root.title("Controlo de Despesas")
global tree
global SEARCH
global descrição, data, opcao, amount
SEARCH = StringVar()
descrição = StringVar()
data = StringVar()
opcao = StringVar()
amount = 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="Saldo", 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="Opção ", font=("Arial", 12), bg="#15244C", fg="white").pack(side=TOP)
opcao.set("Selecionar Opção")
content = {'Receita', 'Despesa'}
OptionMenu(LFrom, opcao, *content).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=amount).pack(side=TOP, padx=10, fill=X)
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="Descrição", font=('verdana', 10), bg="#0B4670")
lbl_txtsearch.pack()
search = Entry(LeftViewForm, textvariable=SEARCH, font=('verdana', 15), width=10)
search.pack(side=TOP, padx=10, fill=X)
btn_search = Button(LeftViewForm, text="Pesquisa", bg="cyan", command=SearchRecord)
btn_search.pack(side=TOP, padx=10, pady=10, fill=X)
btn_view = Button(LeftViewForm, text="Ver tudo", bg="cyan", command=DisplayData)
btn_view.pack(side=TOP, padx=10, pady=10, fill=X)
btn_Limpar = Button(LeftViewForm, text="Limpar", bg="cyan", command=limpar)
btn_Limpar.pack(side=TOP, padx=10, pady=10, fill=X)
btn_apagar = Button(LeftViewForm, text="Apagar", bg="cyan", command=apagar)
btn_apagar.pack(side=TOP, padx=10, pady=10, fill=X)
btn_actualizar = Button(LeftViewForm, text="Actualizar", bg="cyan", command=actualizacao)
btn_actualizar.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", "Opção", "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('Opção', text="Opção", 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.column('#5', stretch=NO, minwidth=0, width=100)
tree.pack()
tree.bind("<Double-1>", OnDoubleClick)
lbl_total_receita = Label(TopViewForm, text="Total Receita: ", font=('verdana', 12), bg="cyan")
lbl_total_receita.pack(side=LEFT, padx=10)
lbl_total_despesa = Label(TopViewForm, text="Total Despesa: ", font=('verdana', 12), bg="cyan")
lbl_total_despesa.pack(side=LEFT, padx=10)
lbl_saldo = Label(TopViewForm, text="Saldo Atual: ", font=('verdana', 12), bg="cyan")
lbl_saldo.pack(side=LEFT, padx=10)
# Create a Matplotlib figure
fig, ax = plt.subplots()
canvas = FigureCanvasTkAgg(fig, master=root)
canvas.get_tk_widget().pack(side=BOTTOM, fill=BOTH, expand=True)
DisplayData()
root.mainloop()
def register():
Database()
vdescricao = descrição.get()
vdata = data.get()
vopcao = opcao.get()
vamount = amount.get()
if vdescricao == '' or vdata == '' or vopcao == '' or vopcao == 'Selecionar Opção' or vamount == 0:
tkMessageBox.showinfo("Atenção", "Preencha os espaços vazios!!!")
else:
conn.execute('INSERT INTO REGISTRATION (DESCRICAO, DATA, OPCAO, AMOUNT) VALUES (?, ?, ?, ?)',
(vdescricao, vdata, vopcao, vamount))
conn.commit()
tkMessageBox.showinfo("Sucesso", "Registro adicionado com sucesso")
DisplayData()
conn.close()
def SearchRecord():
Database()
if SEARCH.get() != "":
tree.delete(*tree.get_children())
cursor = conn.execute("SELECT * FROM REGISTRATION WHERE DESCRICAO LIKE ?", ('%' + str(SEARCH.get()) + '%',))
fetch = cursor.fetchall()
for data in fetch:
tree.insert('', 'end', values=(data))
cursor.close()
conn.close()
def actualizacao():
Database()
vdescricao = descrição.get()
vdata = data.get()
vopcao = opcao.get()
vamount = amount.get()
if vdescricao == '' or vdata == '' or vopcao == '' or vopcao == 'Selecionar Opção' or vamount == 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=?, OPCAO=?, AMOUNT=? WHERE RID = ?',
(vdescricao, vdata, vopcao, vamount, 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("")
opcao.set("Selecionar Opção")
amount.set(0.0)
def DisplayData():
Database()
tree.delete(*tree.get_children())
cursor = conn.execute("SELECT * FROM REGISTRATION")
fetch = cursor.fetchall()
total_receita = 0.0
total_despesa = 0.0
for data in fetch:
tree.insert('', 'end', values=(data))
if data[3] == 'Receita':
total_receita += data[4]
elif data[3] == 'Despesa':
total_despesa += data[4]
saldo_atual = total_receita - total_despesa
lbl_total_receita.config(text="Total Receita: {:.2f}".format(total_receita))
lbl_total_despesa.config(text="Total Despesa: {:.2f}".format(total_despesa))
lbl_saldo.config(text="Saldo Atual: {:.2f}".format(saldo_atual))
# Update the Matplotlib figure
ax.clear()
categories = ['Total Receita', 'Total Despesa']
values = [total_receita, total_despesa]
ax.bar(categories, values)
canvas.draw()
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])
opcao.set(selecteditem[3])
amount.set(selecteditem[4])
DisplayForm()
if __name__ == '__main__':
mainloop()
Comentários
Enviar um comentário