Criar projeto de acompanhamento de despesas em Python

import datetime
import sqlite3
from tkcalendar import DateEntry
from tkinter import *
import tkinter.messagebox as mb
import tkinter.ttk as ttk
def sair():
a = mb.askquestion('Sair da Aplicação', 'Deseja sair da aplicação?', icon="warning")
if a == 'yes':
root.destroy()
exit()
def list_all_expenses():
global connector, table
table.delete(*table.get_children())
all_data = connector.execute('SELECT * FROM ExpenseTracker')
data = all_data.fetchall()
for values in data:
table.insert('', END, values=values)
def view_expense_details():
global table
global data, beneficiario, descricao, montante, MoP
if not table.selection():

mb.showerror('Nenhuma despesa selecionada', 'Por favor, selecione uma despesa')
current_selected_expense = table.item(table.focus())
values = current_selected_expense['values']
expenditure_date = datetime.date(int(values[1][:4]), int(values[1][5:7]), int(values[1][8:]))
date.set_date(expenditure_date) ; beneficiario.set(values[2]) ; descricao.set(values[3]) ; montante.set(values[4]) ; MoP.set(values[5])
def clear_fields():
global descricao, beneficiario, montante, MoP, date, table
today_date = datetime.datetime.now().date()
descricao.set('') ; beneficiario.set('') ; montante.set(0.0) ; MoP.set('Dinheiro'), date.set_date(today_date)
table.selection_remove(*table.selection())
def remove_expense():
if not table.selection():
mb.showerror('Nenhum registro selecionado!', 'Selecione um registro para eliminar!')
return
current_selected_expense = table.item(table.focus())
values_selected = current_selected_expense['values']
surety = mb.askyesno('Tem certeza?', f'Tem certeza de que deseja excluir o registro de {values_selected[2]} ?')
if surety:
connector.execute('DELETE FROM ExpenseTracker WHERE ID=%d' % values_selected[0])
connector.commit()
list_all_expenses()
mb.showinfo('Registro excluído com sucesso!', 'O registro que você deseja excluir foi excluído com sucesso.')
def remove_all_expenses():
surety = mb.askyesno('Tem certeza?', 'Tem certeza de que deseja excluir todos os itens de despesas do banco de dados?', icon='warning')
if surety:
table.delete(*table.get_children())
connector.execute('DELETE FROM ExpenseTracker')
connector.commit()
clear_fields()
list_all_expenses()
mb.showinfo('Todas as despesas excluídas', 'Todas as despesas foram excluídas com sucesso')
else:
mb.showinfo('Todas as despesas excluídas', 'A tarefa foi abortada e nenhuma despesa foi excluída!')
def add_another_expense():
global data, beneficiario, descricao, montante, MoP
global connector
if not date.get() or not beneficiario.get() or not descricao.get() or not montante.get() or not MoP.get():
mb.showerror('Campos vazios!', "Por favor, preencha todos os campos em falta antes de pressionar o botão adicionar!")
else:
connector.execute(
'INSERT INTO ExpenseTracker (Date, Payee, Description, Amount, ModeOfPayment) VALUES (?, ?, ?, ?, ?)',
(date.get_date(), beneficiario.get(), descricao.get(), montante.get(), MoP.get())
)
connector.commit()
clear_fields()
list_all_expenses()
mb.showinfo('Despesa adicionada', 'A despesa cujos detalhes você acabou de inserir foi adicionada ao banco de dados.')
def edit_expense():
global table
def edit_existing_expense():
global date, amnt, desc, payee, MoP
global connector, table
current_selected_expense = table.item(table.focus())
contents = current_selected_expense['values']
connector.execute('UPDATE ExpenseTracker SET Date = ?, Payee = ?, Description = ?, Amount = ?, ModeOfPayment = ? WHERE ID = ?',
(date.get_date(), payee.get(), desc.get(), amnt.get(), MoP.get(), contents[0]))
connector.commit()
clear_fields()
list_all_expenses()
mb.showinfo('Dados editados', 'Atualizamos os dados e armazenamos no banco de dados como você queria')
edit_btn.destroy()
return
if not table.selection():
mb.showerror('Nenhuma despesa selecionada!', 'Você não selecionou nenhuma despesa na tabela para nós editarmos; Por favor, faça isso!')
return
view_expense_details()
edit_btn = Button(data_entry_frame, text='Editar Despesa', font=('Arial', 12, 'bold'), width=30,
bg="#0339fc", command=edit_existing_expense)
edit_btn.place(x=10, y=395)

connector = sqlite3.connect("Expense Tracker.db")
cursor = connector.cursor()
connector.execute(
'CREATE TABLE IF NOT EXISTS ExpenseTracker (ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, Date DATETIME, Payee TEXT, Description TEXT, Amount FLOAT, ModeOfPayment TEXT)'
)
connector.commit()

root = Tk()
root.title('Despesas')
root.geometry('1200x550')
root.resizable(0, 0)
Label(root, text='Despesas', font=('Arial', 12, 'bold'),bg="#1f4a87",fg="#d3d60f").pack(side=TOP, fill=X)
descricao = StringVar()
montante = DoubleVar()
beneficiario = StringVar()
MoP = StringVar(value='Dinheiro')
# Frames
data_entry_frame = Frame(root, bg="#03fcf8")
data_entry_frame.place(x=0, y=30, relheight=0.95, relwidth=0.25)
buttons_frame = Frame(root, bg="#03fcf8")
buttons_frame.place(relx=0.25, rely=0.05, relwidth=0.75, relheight=0.21)
tree_frame = Frame(root)
tree_frame.place(relx=0.25, rely=0.26, relwidth=0.75, relheight=0.74)
# Data Entry Frame
Label(data_entry_frame, text='Data (M/DD/YY) :', font=('Arial', 12, 'bold'), bg="#03fcf8").place(x=10, y=50)
date = DateEntry(data_entry_frame, date=datetime.datetime.now().date(), font=('Arial', 12, 'bold'))
date.place(x=160, y=50)
Label(data_entry_frame, text='Beneficiário\t :', font=('Arial', 12, 'bold'), bg="#03fcf8").place(x=10, y=230)
Entry(data_entry_frame, font=('Arial', 12, 'bold'), width=31, text=beneficiario).place(x=10, y=260)
Label(data_entry_frame, text='Descrição :', font=('Arial', 12, 'bold'),bg="#03fcf8").place(x=10, y=100)
Entry(data_entry_frame, font=('Arial', 12, 'bold'), width=31, text=descricao).place(x=10, y=130)
Label(data_entry_frame, text='Montante\t :', font=('Arial', 12, 'bold'), bg="#03fcf8").place(x=10, y=180)
Entry(data_entry_frame, font=('Arial', 12, 'bold'), width=14, text=montante).place(x=160, y=180)
Label(data_entry_frame, text='Modo de Pagamento:', font=('Arial', 12, 'bold'), bg="#03fcf8").place(x=35, y=310)
dd1 = OptionMenu(data_entry_frame, MoP, *['Dinheiro', 'Cheque', 'Cartão de Crédito', 'Cartão de Débito', 'Paytm', 'Google Pay', 'Razorpay'])
dd1.place(x=60, y=335) ; dd1.configure(width=10, font=('Arial', 12, 'bold'))
Button(data_entry_frame, text='Adicionar despesa', command=add_another_expense, font=('Arial', 12, 'bold'), width=30,
bg="#038cfc").place(x=10, y=395)
# Buttons' Frame
Button(buttons_frame, text='Apagar Despesas', font=('Arial', 12, 'bold'), width=25, bg="#038cfc", command=remove_expense).place(x=30, y=5)
Button(buttons_frame, text='Limpar Formulário', font=('Arial', 12, 'bold'), width=25, bg="#038cfc",
command=clear_fields).place(x=335, y=5)
Button(buttons_frame, text='Apagar Tudo', font=('Arial', 12, 'bold'), width=25, bg="#038cfc", command=remove_all_expenses).place(x=640, y=5)
Button(buttons_frame, text='Ver despesa', font=('Arial', 12, 'bold'), width=25, bg="#038cfc",
command=view_expense_details).place(x=30, y=65)
Button(buttons_frame, text='Editar despesa', command=edit_expense, font=('Arial', 12, 'bold'), width=25, bg="#038cfc").place(x=335,y=65)
Button(buttons_frame, text='Sair', font=('Arial', 12, 'bold'),width=25,bg="#db0d29",fg="#7d871f",command=sair).place(x=640, y=65)
# Treeview Frame
table = ttk.Treeview(tree_frame, selectmode=BROWSE, columns=('ID', 'Date', 'Payee', 'Description', 'Amount', 'Mode of Payment'))
X_Scroller = Scrollbar(table, orient=HORIZONTAL, command=table.xview)
Y_Scroller = Scrollbar(table, orient=VERTICAL, command=table.yview)
X_Scroller.pack(side=BOTTOM, fill=X)
Y_Scroller.pack(side=RIGHT, fill=Y)
table.config(yscrollcommand=Y_Scroller.set, xscrollcommand=X_Scroller.set)
table.heading('ID', text='S No.', anchor=CENTER)
table.heading('Date', text='Data', anchor=CENTER)
table.heading('Payee', text='Beneficiário', anchor=CENTER)
table.heading('Description', text='Descrição', anchor=CENTER)
table.heading('Amount', text='Montante', anchor=CENTER)
table.heading('Mode of Payment', text='Modo de Pagamento', anchor=CENTER)
table.column('#0', width=0, stretch=NO)
table.column('#1', width=50, stretch=NO)
table.column('#2', width=95, stretch=NO)
table.column('#3', width=150, stretch=NO)
table.column('#4', width=325, stretch=NO)
table.column('#5', width=135, stretch=NO)
table.column('#6', width=125, stretch=NO)
table.place(relx=0, y=0, relheight=1, relwidth=1)
list_all_expenses()
root.update()
root.mainloop()

Fonte: Código tiradi através do seguinte site

Comentários

Mensagens populares deste blogue

Criar Cartões de Visita

12 signos egípcios

Calcular a percentagem de ocupação