Mundo em Python

Despesas (usando Tkinter CRUD)

import datetime
import sqlite3
from tkcalendar import DateEntry
from tkinter import *
import tkinter.messagebox as mb
import tkinter.ttk as ttk root = Tk()
root.title('Lista de Despesas')
root.geometry('1200x650')
root.resizable(0, 0) connector = sqlite3.connect("despesas.db")
cursor = connector.cursor()
connector.execute(
'CREATE TABLE IF NOT EXISTS Despesas (ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, Data DATETIME, Benefeciario TEXT, Descrisao TEXT,'
' Montante FLOAT, Modo_de_Pagamento TEXT)'
)
connector.commit()
def lista_todas_despesas():
global connector, tabela
tabela.delete(*tabela.get_children())
toda_data = connector.execute('SELECT * FROM Despesas')
data = toda_data.fetchall()
for values in data:
tabela.insert('', END, values=values)
def limpar_ficheiros():
global descricao, beneficiario, montante, MoP, data, tabela
data_hoje = datetime.datetime.now().date()
descricao.set('') ; beneficiario.set('') ; montante.set(0.0) ; MoP.set('Dinheiro'), data.set_date(data_hoje)
tabela.selection_remove(*tabela.selection())
def adiciona_despesa():
global data, beneficiario, descricao, montante, MoP
global connector
if not data.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 Despesas (Data, Benefeciario, Descrisao, Montante, Modo_de_Pagamento) VALUES (?, ?, ?, ?, ?)',
(data.get_date(), beneficiario.get(), descricao.get(), montante.get(), MoP.get())
)
connector.commit()
limpar_ficheiros()
lista_todas_despesas()
mb.showinfo('Despesa Adicionada', 'A despesa foi adicionada ao banco de dados') def remover_despesas():
if not tabela.selection():
mb.showerror('Erro!', 'Por favor, selecione uma despesa!')
return
current_selected_expense = tabela.item(tabela.focus())
values_selected = current_selected_expense['values']
surety = mb.askyesno('Pergunta', f'Deseja pagar {values_selected[2]}?')
if surety:
connector.execute('DELETE FROM Despesas WHERE ID=%d' % values_selected[0])
connector.commit()
lista_todas_despesas()
mb.showinfo('Eliminar!', 'Apagado com Sucesso') def ver_detalhes():
global tabela
global data, beneficiario, descricao, montante, MoP
if not tabela.selection():
mb.showerror('Nenhuma despesas selecionada', 'Por favor, selecine uma despesa')
current_selected_expense = tabela.item(tabela.focus())
values = current_selected_expense['values']
expenditure_date = datetime.date(int(values[1][:4]), int(values[1][5:7]), int(values[1][8:]))
data.set_date(expenditure_date) ; beneficiario.set(values[2]) ; descricao.set(values[3]) ; montante.set(values[4]) ; MoP.set(values[5]) def eliminar_todas_despesas():
surety = mb.askyesno('Eliminar Tudo', 'Deseja apagar tudo?', icon='warning')
if surety:
tabela.delete(*tabela.get_children())
connector.execute('DELETE FROM Despesas')
connector.commit()
limpar_ficheiros()
lista_todas_despesas()
mb.showinfo('Informação', 'Todos os dados apagados com sucesso.')
else:
mb.showinfo('Informação', 'A tarefa foi cancelada e nenhuma despesa foi apagada!') def editar_despesas():
global tabela
def editar_despesa_alargado():
global data, beneficiario, descricao, montante, MoP
global connector, tabela
current_selected_expense = tabela.item(tabela.focus())
contents = current_selected_expense['values']
connector.execute('UPDATE Despesas SET Data = ?, Benefeciario = ?, Descrisao = ?, Montante = ?, Modo_de_Pagamento = ? WHERE ID = ?',
(data.get_date(), beneficiario.get(), descricao.get(), montante.get(), MoP.get(), contents[0]))
connector.commit()
limpar_ficheiros()
lista_todas_despesas()
mb.showinfo('Dado editado', 'Alterou o dado')
edit_btn.destroy()
return
if not tabela.selection():
mb.showerror('Atenção!', 'Não selecionou uma despesa!')
return
ver_detalhes()
edit_btn = Button(dados_entrada_frame, text='Editar Despesas',font=("Arial","12","bold"), width=20,
bg="#c8d7e0",command=editar_despesa_alargado).place(x=30, y=395) def SearchRecord():
global data, beneficiario, descricao, montante, MoP
global connector if SEARCH.get() != "":
tabela.delete(*tabela.get_children())
cursor=connector.execute("SELECT * FROM Despesas WHERE beneficiario LIKE ?", ('%' + str(SEARCH.get()) + '%',))
fetch = cursor.fetchall()
for data in fetch:
tabela.insert('', 'end', values=(data))
cursor.close()
connector.close() def sair ():
root.destroy()
Label(root, text='Lista de Despesas', font=('Noto Sans CJK TC', 15, 'bold'), bg="#5ddebf").pack(side=TOP, fill=X) MoP = StringVar(value='Dinheiro')
descricao = StringVar()
beneficiario = StringVar()
montante = DoubleVar()
SEARCH = StringVar()
# font = ("Arial","12","bold")
dados_entrada_frame = Frame(root, bg="#4b68db")
dados_entrada_frame.place(x=0, y=30, relheight=0.95, relwidth=0.25)
butaos_frame = Frame(root, bg="#0a334d")
butaos_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)
# Introdução de dados
Label(dados_entrada_frame, text='Data (M/DD/YY) :', font=("Arial","12","bold"), bg="#3a95cf").place(x=10, y=50)
data = DateEntry(dados_entrada_frame, date=datetime.datetime.now().date(), font=("Arial","12","bold"))
data.place(x=160, y=50) Label(dados_entrada_frame, text='Beneficiário\t :', font=("Arial","12","bold"),
bg="#3a95cf").place(x=10, y=250)
Entry(dados_entrada_frame, font=("Arial","12","bold"), width=31, text=beneficiario).place(x=10, y=280)
Label(dados_entrada_frame, text='Descrição:', font=("Arial","12","bold"), bg="#3a95cf").place(x=10, y=100)
Entry(dados_entrada_frame, font=("Arial","12","bold"), width=31, text=descricao).place(x=10, y=140)
Label(dados_entrada_frame, text='Montante Pagamento\t :', font=("Arial","12","bold"),
bg="#3a95cf").place(x=10, y=180)
Entry(dados_entrada_frame, font=("Arial","12","bold"), width=14, text=montante,justify='center').place(x=20, y=220)
Label(dados_entrada_frame, text='Modo de Pagamento:', font=("Arial","12"), bg="#3a95cf").place(x=10, y=305)
dd1 = OptionMenu(dados_entrada_frame, MoP, *['Dinheiro', 'Cheque', 'Cartão de Crédito',
'Cartão de Débito', 'MBWay', 'Google Pay', 'Razorpay'])
dd1.place(x=100, y=340) ; dd1.configure(width=15, font=("Arial","12","bold"))
Button(dados_entrada_frame, text='Adicionar Despesas',font=("Arial","12","bold"), width=20,
bg="#c8d7e0",command=adiciona_despesa).place(x=30, y=395) search = Entry(dados_entrada_frame, textvariable=SEARCH, font=('verdana', 12), width=20)
search.place(x=30, y=450)
search.insert(0, "Digite tipo Beneficiário")
#, command=SearchRecord
btn_search = Button(dados_entrada_frame, text="Pesquisa",font=("Arial","12","bold"), width=20, bg="#c8d7e0",command=SearchRecord)
btn_search.place(x=30, y=500) #command=remove_expense
Button(butaos_frame, text='Apagar Despesas', font=("Arial","12","bold"), width=20, bg="#c8d7e0",command=remover_despesas).place(x=30, y=5)
Button(butaos_frame, text='Limpar Formulário', font=("Arial","12","bold"), width=20, bg="#c8d7e0",command=limpar_ficheiros).place(x=335, y=5)
Button(butaos_frame, text='Apagar Tudo', font=("Arial","12","bold"), width=20, bg="#c8d7e0",command=eliminar_todas_despesas).place(x=640, y=5)
Button(butaos_frame, text='Ver Despesa Detalhada', font=("Arial","12","bold"), width=20, bg="#c8d7e0",command=ver_detalhes).place(x=30, y=65)
Button(butaos_frame, text='Editar Despesa', font=("Arial","12","bold"), width=20, bg="#c8d7e0",command=editar_despesas).place(x=335,y=65)
Button(butaos_frame, text='Sair', font=("Arial","12","bold"), width=20, bg="#c8d7e0", command=sair).place(x=640, y=65)
tabela = ttk.Treeview(tree_frame, selectmode=BROWSE, columns=('ID', 'Data', 'Benefeciario', 'Descrisao', 'Montante', 'Modo_de_Pagamento'))
X_Scroller = Scrollbar(tabela, orient=HORIZONTAL, command=tabela.xview)
Y_Scroller = Scrollbar(tabela, orient=VERTICAL, command=tabela.yview)
X_Scroller.pack(side=BOTTOM, fill=X)
Y_Scroller.pack(side=RIGHT, fill=Y)
tabela.config(yscrollcommand=Y_Scroller.set, xscrollcommand=X_Scroller.set)
tabela.heading('ID', text='S No.', anchor=CENTER)
tabela.heading('Data', text='Data', anchor=CENTER)
tabela.heading('Benefeciario', text='Benefeciário', anchor=CENTER)
tabela.heading('Descrisao', text='Descrisão', anchor=CENTER)
tabela.heading('Montante', text='Montante', anchor=CENTER)
tabela.heading('Modo_de_Pagamento', text='Modo de Pagamento', anchor=CENTER)
tabela.column('#0', width=0, stretch=NO)
tabela.column('#1', width=50, stretch=NO)
tabela.column('#2', width=95, stretch=NO)
tabela.column('#3', width=150, stretch=NO)
tabela.column('#4', width=325, stretch=NO)
tabela.column('#5', width=135, stretch=NO)
tabela.column('#6', width=125, stretch=NO)
tabela.place(relx=0, y=0, relheight=1, relwidth=1)
lista_todas_despesas()
root.update()
root.mainloop()
root.mainloop()
0