Escolar Documentos
Profissional Documentos
Cultura Documentos
Neste guia de ebook, você não caminhará sozinho, pois estarei sempre disponível para
orientá-lo e responder suas dúvidas (LIVE ou apenas por mensagens). Pois com este
guia, quero que você pratique a linguagem de programação Python de uma forma mais
prática que é criar projetos em Python, e também haverá projetos que você pode
Orçamento Pessoal
O guia está bem estruturado e comentado, e em caso de dúvida pode sempre
Este projeto será muito útil e também será útil para o seu portfólio sem dúvida. Aqui eu
gostaria que você não apenas seguisse o tutorial, mas também ao longo do caminho
Importante: Após a compra deste produto, poderei ajudá-lo por 1 mês a entender o
conteúdo aqui, então fique à vontade e não hesite em entrar em contato comigo se
Nota: neste guia em alguns pontos você precisará entrar em contato comigo para que
eu possa explicar alguns dos códigos aqui presentes, pois apenas lendo não será fácil
de dúvida recomendo que entre em contato comigo pelo instagram ou linkedin, pois lá
começar a criar nosso banco de dados, este será um banco de dados bem simples sem
muitas tabelas, apenas uma, então vamos começar a criar nosso banco de dados.
Crie um novo arquivo Python e salve-o como criarbd.py e importe o Sqlite dentro desse
arquivo.
# importando o SQLite
import sqlite3 as lite
Agora vamos criar uma conexão com um novo banco de dados que se parecerá com
isto:
# Criando conexão
con = lite.connect('dados.db')
1
# importando o SQLite
# Criando conexão
con = lite.connect('dados.db')
with con:
cur = con.cursor()
with con:
cur = con.cursor()
cur.execute("CREATE TABLE Receitas(id INTEGER PRIMARY KEY AUTOINCREMENT,categoria TEXT, adicionado_em DATE, valor DECIMAL)")
with con:
cur = con.cursor()
cur.execute("CREATE TABLE Gastos(id INTEGER PRIMARY KEY AUTOINCREMENT,categoria TEXT, retirado_em DATE, valor DECIMAL)")
Agora execute o código que nosso banco de dados será criado, desta forma acabamos
com o banco de dados criando um novo arquivo python que chamarei de view.py,
2
import sys
import sqlite3 as lite
from datetime import datetime
# importing pandas
import pandas as pd
# Criando conexão
con = lite.connect('dados.db')
# Inserir categoria
def inserir_categoria(i):
with con:
cur = con.cursor()
query = "INSERT INTO Categoria (nome) VALUES (?)"
cur.execute(query, i)
# Inserir receitas
def inserir_receita(i):
with con:
cur = con.cursor()
query = "INSERT INTO Receitas (categoria, adicionado_em, valor) VALUES (?,?,?)"
cur.execute(query, i)
# Inserir gastos
def inserir_gastos(i):
with con:
cur = con.cursor()
query = "INSERT INTO Gastos (categoria, retirado_em, valor) VALUES (?,?,?)"
cur.execute(query, i)
# Deletar receitas
def deletar_receitas(i):
with con:
cur = con.cursor()
query = "DELETE FROM Receitas WHERE id=?"
cur.execute(query, i)
# Deletar gastos
def deletar_gastos(i):
with con:
cur = con.cursor()
query = "DELETE FROM Receitas WHERE id=?"
cur.execute(query, i)
3
# Ver Categorias
def ver_categorias():
lista_itens = []
with con:
cur = con.cursor()
cur.execute("SELECT * FROM Categoria")
rows = cur.fetchall()
for row in rows:
lista_itens.append(row)
return lista_itens
# Ver Receitas
def ver_Receitas():
lista_itens = []
with con:
cur = con.cursor()
cur.execute("SELECT * FROM Receitas")
rows = cur.fetchall()
for row in rows:
lista_itens.append(row)
return lista_itens
# Ver Gastos
def ver_gastos():
lista_itens = []
with con:
cur = con.cursor()
cur.execute("SELECT * FROM Gastos")
rows = cur.fetchall()
for row in rows:
lista_itens.append(row)
return lista_itens
Como eu disse neste guia, você não fará isso sozinho quando chegar a esta parte, sinta-
se à vontade para entrar em contato comigo e explicarei essa parte para você.
4
Criando a interface
Ok, agora que a parte de backend está pronta, vamos criar a interface para nossa
aplicação, começar criando um novo arquivo, o meu vou nomeá-lo main.py, e começar
Vamos agora criar uma janela vazia, e também existem algumas cores que selecionei
que usaremos neste projeto, então você passará o seguinte código para o seu arquivo:
janela = Tk ()
janela.title ("")
janela.geometry('900x650')
janela.configure(background=co9)
janela.resizable(width=FALSE, height=FALSE)
style = ttk.Style(janela)
style.theme_use("clam")
style.configure("Treeview", highlightthickness=0, bd=0, font=('Calibri', 9)) # Modify the
font of the body
janela.mainloop ()
5
Agora vamos criar alguns FRAMES que nos permitirão dividir a janela que acabamos de
criar:
6
Agora vamos começar colocando o logo do app, que será algo assim:
# abrindo imagem
app_img = Image.open('log.png')
app_img = app_img.resize((45, 45))
app_img = ImageTk.PhotoImage(app_img)
Veja, se você executar este aplicativo você receberá um erro porque o Pillow não está
instalado, então você terá que instalar a biblioteca Pillow, basta fazer o seguinte no seu
7
Veja para imagens use o site https://icons8.com/icons/set/angola pois existem várias
Perfeito, depois disso vamos criar alguns gráficos que irão mostrar a estatísticas dos
nossos gastos assim como quanto ainda resta na nossa conta, assim teremos:
- Primeiramente import os codigos abaixo para o seu script pois precisaremos deles
8
Agora iremos criar os graficos para o nosso aplicativo, por enquanto vamos passar nele
conecao entre o backend e o front end ai sim iremos usar os dados verdadeiros. Entao
# percentagem ------------------------------------
def percentagem():
l_nome = Label(frameMeio, text="Porcentagem da receita gasta", height=1,anchor=NW,
font=('Verdana 12 '), bg=co1, fg=co4)
l_nome.place(x=7, y=5)
style = ttk.Style()
style.theme_use('default')
style.configure("black.Horizontal.TProgressbar", background='#daed6b')
style.configure("TProgressbar", thickness=25)
bar = Progressbar(frameMeio, length=180,style='black.Horizontal.TProgressbar')
bar.place(x=10, y=35)
bar['value'] = 50
valor = 50
print(valor)
l_percentagem = Label(frameMeio, text='{:,.2f} %'.format(valor), height=1,anchor=NW,
font=('Verdana 12 '), bg=co1, fg=co4)
l_percentagem.place(x=200, y=35)
percentagem()
9
# funcao para grafico bar ------------------------
def grafico_bar():
# obtendo valores de meses
lista_meses = ['Renda', 'Despesa', 'Saldo']
lista_valores = [345,225,534]
c = 0
# set individual bar lables using above list
for i in ax.patches:
# get_x pulls left or right; get_height pushes up or down
ax.text(i.get_x()-.001, i.get_height()+.5,
str("{:,.0f}".format(lista_valores[c])), fontsize=17,
fontstyle='italic', verticalalignment='bottom',color='dimgrey')
c += 1
ax.set_xticklabels(lista_meses,fontsize=16)
ax.patch.set_facecolor('#ffffff')
ax.spines['bottom'].set_color('#CCCCCC')
ax.spines['bottom'].set_linewidth(1)
ax.spines['right'].set_linewidth(0)
ax.spines['top'].set_linewidth(0)
ax.spines['left'].set_color('#CCCCCC')
ax.spines['left'].set_linewidth(1)
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['left'].set_visible(False)
ax.tick_params(bottom=False, left=False)
ax.set_axisbelow(True)
ax.yaxis.grid(False, color='#EEEEEE')
ax.xaxis.grid(False)
grafico_bar()
# -----------------------------------------------------------------------------------------
10
# funcao de resumo total
def resumo():
valor = [345,225,534]
resumo()
# ----------------------------------------------------------------------------------------
11
# funcao grafico pie
def grafico_pie():
# faça figura e atribua objetos de eixo
figura = plt.Figure(figsize=(5, 3), dpi=90)
ax = figura.add_subplot(111)
lista_valores = [345,225,534]
lista_categorias = ['Renda', 'Despesa', 'Saldo']
explode = []
for i in lista_categorias:
explode.append(0.05)
grafico_pie()
Veja, assim que você executar este código, você poderá receber um erro, isso é devido a
uma biblioteca ausente. Então, para corrigir isso, basta verificar qual das bibliotecas
12
Vamos criar agora a nossa tabela para Receitas e despesas, essa tabela ira mostrar o
histórico completo.
Mas primeiramente iremos criar novos frames para a tabela e também para o local
13
E para a tabela teremos ( vamos usar por enquanto dados falsos ):
14
# Tabela Renda mensal -------------------------
lista_itens = [[0,2,3,4],[0,2,3,4],[0,2,3,4],[0,2,3,4]]
global tree
tree.configure(yscrollcommand=vsb.set, xscrollcommand=hsb.set)
hd=["center","center","center", "center"]
h=[30,100,100,100]
n=0
n+=1
mostrar_renda()
15
Agora vamos criar alguns campos de entradas e botões que irão realizar as funções
Veja, assim que você executar este código, você receberá um erro, isso é devido a uma
biblioteca ausente. Então, para corrigir isso, basta instalar a seguinte biblioteca e
# tkcalendar
from tkcalendar import Calendar, DateEntry
from datetime import date
16
Vamos entao criar a parte para o CRUD
# Pegando os categorias
categorias_funcao = ['viagens','comida']
categorias = []
for i in categorias_funcao:
categorias.append(i[1])
# Botao Inserir
img_add_despesas = Image.open('add.png')
img_add_despesas = img_add_despesas.resize((17,17))
img_add_despesas = ImageTk.PhotoImage(img_add_despesas)
botao_inserir_despesas = Button(frame_operacoes,image=img_add_despesas, compound=LEFT,
anchor=NW, text=" Adicionar".upper(), width=80, overrelief=RIDGE, font=('ivy 7
bold'),bg=co1, fg=co0 )
botao_inserir_despesas.place(x=110, y=131)
17
# operacao Excluir -----------------------
l_n_categoria = Label(frame_operacoes, text="Excluir ação", height=1,anchor=NW, font=('Ivy
10 bold'), bg=co1, fg=co4)
l_n_categoria.place(x=10, y=190)
# Botao Deletar
img_delete = Image.open('delete.png')
img_delete = img_delete.resize((20, 20))
img_delete = ImageTk.PhotoImage(img_delete)
botao_deletar = Button(frame_operacoes, image=img_delete, compound=LEFT, anchor=NW,
text=" Deletar".upper(), width=80, overrelief=RIDGE, font=('ivy 7 bold'),bg=co1, fg=co0
)
botao_deletar.place(x=110, y=190)
# Botao Inserir
img_add_receitas = Image.open('add.png')
img_add_receitas = img_add_receitas.resize((17,17))
img_add_receitas = ImageTk.PhotoImage(img_add_receitas)
botao_inserir_receitas = Button(frame_configuracao, image=img_add_receitas, compound=LEFT,
anchor=NW, text=" Adicionar".upper(), width=80, overrelief=RIDGE, font=('ivy 7
bold'),bg=co1, fg=co0 )
botao_inserir_receitas.place(x=110, y=111)
18
# operacao Nova Categoria -----------------------
# Botao Inserir
img_add_categoria = Image.open('add.png')
img_add_categoria = img_add_categoria.resize((17,17))
img_add_categoria = ImageTk.PhotoImage(img_add_categoria)
botao_inserir_categoria = Button(frame_configuracao,image=img_add_categoria, compound=LEFT,
anchor=NW, text=" Adicionar".upper(), width=80, overrelief=RIDGE, font=('ivy 7
bold'),bg=co1, fg=co0 )
botao_inserir_categoria.place(x=110, y=190)
Assim terminamos a parte do desenho, agora vamos dar vida ao nosso projeto.
19
Criando funções
Vamos começar primeiro voltar no arquivo view.py, e iremos preparar o código que
irão nos ajudar a trabalhar com as novas funções que iremos criar, então no arquivo
def tabela():
gastos = ver_gastos()
receitas = ver_Receitas()
tabela_lista = []
for i in gastos:
tabela_lista.append(i)
for i in receitas:
tabela_lista.append(i)
return tabela_lista
def bar_valores():
# Receita Total ------------------------
receitas = ver_Receitas()
receitas_lista = []
for i in receitas:
receitas_lista.append(i[3])
receita_total = sum(receitas_lista)
for i in receitas:
despesas_lista.append(i[3])
despesas_total = sum(despesas_lista)
return[receita_total,despesas_total,saldo_total]
20
def percentagem_valor():
# Receita Total ------------------------
receitas = ver_Receitas()
receitas_lista = []
for i in receitas:
receitas_lista.append(i[3])
receita_total = sum(receitas_lista)
for i in receitas:
despesas_lista.append(i[3])
despesas_total = sum(despesas_lista)
return[total]
def pie_valores():
gastos = ver_gastos()
tabela_lista = []
for i in gastos:
tabela_lista.append(i)
lista_quantias = dataframe.values.tolist()
lista_categorias = []
for i in dataframe.index:
lista_categorias.append(i)
return([lista_categorias,lista_quantias])
21
Função Inserir
No código atual, vá abaixo onde você tem o seguinte código:
app_logo = Label(frameCima, image=app_img, text=" Inventário Doméstico", width=900,
compound=LEFT, relief=RAISED, anchor=NW, font=('Verdana 20 bold'),bg=co1, fg=co4 )
app_logo.place(x=0, y=0)
Agora veja, o que vamos fazer primeiro é criar uma variável global chamada tree, que é
o nome da tabela que criamos dentro da função show, para que possamos ter essa
tabela em qualquer parte do nosso código, principalmente as funções que vamos criar.
global tree
Agora vamos criar nossa função insert que será como o código abaixo:
# funcao inserir
def inserir():
global imagem,imagem_string, l_imagem
nome = e_nome.get()
local = e_local.get()
descricao = e_descricao.get()
model = e_model.get()
data = e_cal.get()
valor = e_valor.get()
serie = e_serial.get()
imagem = imagem_string
for i in lista_inserir:
if i=='':
messagebox.showerror('Erro', 'Preencha todos os campos')
return
inserir_form(lista_inserir)
messagebox.showinfo(
'Sucesso', 'Os dados foram inseridos com sucesso')
e_nome.delete(0, 'end')
e_local.delete(0, 'end')
22
e_descricao.delete(0, 'end')
e_model.delete(0, 'end')
e_cal.delete(0, 'end')
e_valor.delete(0, 'end')
e_serial.delete(0, 'end')
mostrar()
Função atualizar
Abaixo da função inserir você colocará o seguinte código:
# funcao atualizar
def atualizar():
try:
treev_dados = tree.focus()
treev_dicionario = tree.item(treev_dados)
treev_lista = treev_dicionario['values']
valor = treev_lista[0]
e_nome.delete(0, 'end')
e_local.delete(0, 'end')
e_descricao.delete(0, 'end')
e_model.delete(0, 'end')
e_cal.delete(0, 'end')
e_valor.delete(0, 'end')
e_serial.delete(0, 'end')
id = int(treev_lista[0])
e_nome.insert(0, treev_lista[1])
e_local.insert(0, treev_lista[2])
e_descricao.insert(0, treev_lista[3])
e_model.insert(0, treev_lista[4])
e_cal.insert(0, treev_lista[5])
e_valor.insert(0, treev_lista[6])
e_serial.insert(0, treev_lista[7])
23
def update():
global imagem,imagem_string, l_imagem
nome = e_nome.get()
local = e_local.get()
descricao = e_descricao.get()
model = e_model.get()
data = e_cal.get()
valor = e_valor.get()
serie = e_serial.get()
imagem = imagem_string
if imagem == '':
imagem = e_serial.insert(0, treev_lista[7])
for i in lista_atualizar:
if i=='':
messagebox.showerror('Erro', 'Preencha todos os campos')
return
atualizar_form(lista_atualizar)
e_nome.delete(0, 'end')
e_local.delete(0, 'end')
e_descricao.delete(0, 'end')
e_model.delete(0, 'end')
e_cal.delete(0, 'end')
e_valor.delete(0, 'end')
e_serial.delete(0, 'end')
botao_confirmar.destroy()
mostrar()
24
botao_confirmar = Button(frameMeio, command=update,
text="Confirmar".upper(), width=13, height=1, bg=co2, fg=co1,font=('ivy 8
bold'),relief=RAISED, overrelief=RIDGE)
botao_confirmar.place(x=330, y=185)
except IndexError:
messagebox.showerror(
'Erro', 'Seleciona um dos dados na tabela')
Função deletar
Abaixo da função atualisar você colocará o seguinte código:
# funcao deletar
def deletar():
try:
treev_dados = tree.focus()
treev_dicionario = tree.item(treev_dados)
treev_lista = treev_dicionario['values']
valor = treev_lista[0]
deletar_form([valor])
messagebox.showinfo(
'Sucesso', 'Os dados foram deletados com sucesso')
mostrar()
except IndexError:
25
messagebox.showerror(
'Erro', 'Seleciona um dos dados na tabela')
Muito bem, se você conseguir implementar com sucesso essas funções acima, a
treev_dados = tree.focus()
treev_dicionario = tree.item(treev_dados)
treev_lista = treev_dicionario['values']
valor = [int(treev_lista[0])]
iten = ver_iten(valor)
imagem = iten[0][8]
# abrindo a imagem
imagem = Image.open(imagem)
imagem = imagem.resize((170, 170))
imagem = ImageTk.PhotoImage(imagem)
26
Parabéns, você conseguiu concluir o projeto, agora aconselho a implementar novas
Tente usar sua criatividade para deixar o app muito mais atrativo e digno de ser
27