Ad Code

Calculadora de Idade em Python


Olá pessoal, neste tutorial vamos construir um aplicativo de calculadora de idade.

O objetivo deste tutorial é obter mais conhecimento sobre a biblioteca Python Time.

Este é um tutorial para iniciantes, e vamos explicar tudo do início ao fim dando todos os detalhes sobre tudo o que faremos, e esperamos que no final você crie outra versão do mesmo aplicativo, mas com funcionalidades extras.

Então vamos começar a construir o aplicativo

Crie um novo script Python e nomeie-o como desejar, o meu chamarei de main.py

Depois disso, importe a biblioteca Tkinter para o script e crie uma nova janela que será a janela principal do aplicativo. E também faz algumas configurações básicas para a janela, como tamanho e altura.


from tkinter import *
from tkinter import ttk

janela = Tk()
janela.title('')
janela.geometry('310x400')

janela.mainloop()

Agora vamos definir o plano de fundo da janela, aqui usaremos esta cor "# 3b3b3b" para o plano de fundo.

from tkinter import *
# cores

cor1="#3b3b3b"

janela.configure(bg=cor1)

Depois disso, dividiremos nossa janela principal em duas partes, uma que conterá o nome do aplicativo e outra que conterá todos os widgets.

E faremos isso usando Frames.


################# Frames ####################
frame_cima = Frame(janela, width=310, height=140, pady=0, padx=0, relief="flat",)
frame_cima.grid(row=0, column=0)

frame_baixo = Frame(janela, width=310, height=400, pady=0, padx=0, relief="flat",)
frame_baixo.grid(row=1, column=0, sticky=NW)


Agora a seguir vamos definir algumas cores para esses Frames, então teremos:


# cores
cor1 = "#3b3b3b" # preta/pesado

cor2 = "#333333" # preta/leve

################# Frames ####################
frame_cima = Frame(janela, width=310, height=140, pady=0, padx=0, relief="flat", bg=cor2)
frame_cima.grid(row=0, column=0)

frame_baixo = Frame(janela, width=310, height=400, pady=0, padx=0, relief="flat", bg=cor1)
frame_baixo.grid(row=1, column=0, sticky=NW)

Em seguida apresentaremos o nome do nosso aplicativo no Frame acima, e para isso teremos que criar alguns Labels, e também faremos algumas configurações de estilo nesses Labels.portanto teremos:


# cores
cor1 = "#3b3b3b" # preta/pesado
cor2 = "#333333" # preta/leve
cor3 = "#FFFFFF" # white / branca
cor4 = "#fcc058" # orange / laranja
app_calculadora = Label(frame_cima, text="CALCULADORA", width=25, height=1, padx=3, relief="flat", anchor="center", font=('Ivy 15 bold'), bg=cor2, fg=cor3)
app_calculadora.place(x=0, y=30)
app_de_idade = Label(frame_cima, text="DE IDADE", width=11, height=1, padx=0, relief="flat", anchor="center", font=('Arial 35 bold'), bg=cor2, fg=cor4)
app_de_idade.place(x=0, y=70)

Agora vamos também criar alguns Labels e Botões no Frame abaixo, primeiro vamos criar um Label mostrando a data de início e outro mostrando a data de nascimento.



# ---- Labels para Frame Baixo -------

l_data_inicial = Label(frame_baixo, text="Data Inicial", height=1,pady=0, padx=0, relief="flat", anchor=NW, font=('Ivy 11'), bg=cor1, fg=cor3)
l_data_inicial.place(x=50, y=30)

l_data_nascimento = Label(frame_baixo, text="Data de nascimento", height=1,pady=0, padx=0, relief="flat", anchor=NW, font=('Ivy 11'), bg=cor1, fg=cor3)
l_data_nascime

Agora, para uma entrada de data no Tkinter, podemos usar a biblioteca tkcalendar, mas primeiro temos que instalá-la, então para instalar tkcalendar, use o seguinte comando:  

pip install tkcalendar

Após a instalação, podemos usá-lo importando-o para o nosso script, então será:


# -------- importando tkcalendar ---------

from tkcalendar import Calendar, DateEntry

Agora que importamos o tkcalendar, vamos fazer uso dele, então agora vamos criar uma caixa de combinação de entrada de data, então teremos:



# ---- Labels para Frame Baixo -------

l_data_inicial = Label(frame_baixo, text="Data Inicial", height=1,pady=0, padx=0, relief="flat", anchor=NW, font=('Ivy 10'), bg=cor1, fg=cor3)
l_data_inicial.place(x=50, y=30)

cal_1 = DateEntry(frame_baixo,width=13, background='darkblue',foreground='white', borderwidth=2,date_pattern='mm/dd/y', year=2021)
cal_1.place(x=170, y=30)

l_data_nascimento = Label(frame_baixo, text="Data de nascimento", height=1,pady=0, padx=0, relief="flat", anchor=NW, font=('Ivy 10'), bg=cor1, fg=cor3)
l_data_nascimento.place(x=50, y=70)

cal_2 = DateEntry(frame_baixo, width=13, background='darkblue',foreground='white', borderwidth=2,date_pattern='mm/dd/y', year=2021)
cal_2.place(x=170, y=70)

Ok, agora vamos criar alguns Labels que exibirão os resultados como Anos, Meses e Dias.


app_1_anos = Label(frame_baixo, text="27", height=1, padx=0, relief="flat", anchor="center", font=('Ivy 25 bold'),bg=cor1, fg=cor3)
app_1_anos.place(x=60, y=135)
app_anos = Label(frame_baixo, text="Anos", height=1, padx=0, relief="flat", anchor="center", font=('Ivy 11 bold'),bg=cor1, fg=cor3)
app_anos.place(x=50, y=175)

app_2_mes = Label(frame_baixo, text="27", height=1, padx=0, relief="flat", anchor="center", font=('Ivy 12 bold'),bg=cor1, fg=cor3)
app_2_mes.place(x=140, y=135)
app_mes = Label(frame_baixo, text="Meses", height=1, padx=0, relief="flat", anchor="center", font=('Ivy 11 bold'),bg=cor1, fg=cor3)
app_mes.place(x=130, y=175)

app_3_dia = Label(frame_baixo, text="27", height=1, padx=0, relief="flat", anchor="center", font=('Ivy 12 bold'),bg=cor1, fg=cor3)
app_3_dia.place(x=220, y=135)
app_dia = Label(frame_baixo, text="Dias", height=1, padx=0, relief="flat", anchor="center", font=('Ivy 11 bold'),bg=cor1, fg=cor3)
app_dia.place(x=210, y=175)

Ok, agora vamos começar a simplificar nosso programa, obtendo os valores de nosso Combobox e calculando a idade específica que queremos saber.

Para obter os valores do Combobox, temos que fazer o seguinte.



inicial=cal_1.get()
terminio=cal_2.get()


Agora que obtemos nossos valores de calendário, queremos obter qualquer valor que selecionarmos, portanto, teremos que fazer o seguinte.

Vamos criar uma função e depois passar esta função para um botão e cada vez que clicarmos naquele botão a função será executada e obteremos o valor que está selecionado no calendário.


#---- Função calcular Idade -----

def calcular():

inicial=cal_1.get()
terminio=cal_2.get()

print(inicial)
print(terminio)


# ----- Botao calcular ------

b_age = Button(frame_baixo, command=calcular, text="Calcular Idade", width=20, height=1, bg=cor1, fg=cor3,font=('Ivy 10 bold'), relief=RAISED, overrelief=RIDGE)
b_age.place(x=60, y=225)


Depois disso agora temos que calcular quantos anos, meses e dias faltam entre as datas que vamos inserir, então para isso temos que fazer o seguinte:

Faremos uso de uma biblioteca, O módulo dateutil fornece extensões poderosas para o módulo datetime padrão, disponível em Python.

Teremos que instalá-lo e faremos isso usando o comando pip install python-dateutil

Após a instalação, importe-o e junto com o datetime em seu script.



# -------- importando dateutil ---------
from dateutil.relativedelta import relativedelta

# -------- importando datetime ---------
from datetime import date


O relativedelta que acabamos de importar aceita 2 parâmetros, a data de início e a data de término.

Já temos a data de início e a data de término, então só temos que passar para relativedelta, então será:



#---- Funcao calcular Idade -----
def calcular():

inicial=cal_1.get()
terminio=cal_2.get()

anos = relativedelta(inicial, terminio).years
meses = relativedelta(inicial, terminio).months
dias = relativedelta(inicial, terminio).days


print(inicial)
print(terminio)


Depois disso, vamos executar, e ao clicar no botão Calcular idade  teremos um erro, isso porque relativedelta só aceita dados vindos de datatime/date, conforme mostrado no erro que obtemos.

Para corrigir isso, teremos que converter os dados que obtivermos em datatime, para isso, faremos o seguinte:


# separando os valores e atribuindo em variaveis diferentes
mes_1, dia_1, ano_1 = [int(f) for f in inicial.split('/')]

# Convertendo os valores em formato datatime
data_inicial = date(ano_1, mes_1, dia_1)

# separando os valores e atribuindo em variaveis diferentes
mes_2, dia_2, ano_2 = [int(f) for f in terminio.split('/')]

# Convertendo os valores em formato datatime
data_nascimento = date(ano_2, mes_2, dia_2)


E no final, nossa função ficará assim:


#---- Funcao calcular Idade -----
def calcular():

inicial=cal_1.get()
terminio=cal_2.get()

# separando os valores e atribuindo em variaveis diferentes
mes_1, dia_1, ano_1 = [int(f) for f in inicial.split('/')]

# Convertendo os valores em formato datatime
data_inicial = date(ano_1, mes_1, dia_1)

# separando os valores e atribuindo em variaveis diferentes
mes_2, dia_2, ano_2 = [int(f) for f in terminio.split('/')]

# Convertendo os valores em formato datatime
data_nascimento = date(ano_2, mes_2, dia_2)

anos = relativedelta(data_inicial, data_nascimento).years
meses = relativedelta(data_inicial, data_nascimento).months
dias = relativedelta(data_inicial, data_nascimento).days


print(inicial)
print(terminio) 


E se executarmos, não obteremos mais o erro anterior.

E para mostrar o resultado do cálculo, vamos apenas imprimir os valores das variáveis anos, meses e dias


print(anos)
print(meses)
print(dias)
Agora envez de imprimirmos os resultados iremos mostra-los nos Labels que nos havíamos criado, então isto será:

#---- Funcao calcular Idade -----
def calcular():

inicial=cal_1.get()
terminio=cal_2.get()

# separando os valores e atribuindo em variaveis diferentes
mes_1, dia_1, ano_1 = [int(f) for f in inicial.split('/')]

# Convertendo os valores em formato datatime
data_inicial = date(ano_1, mes_1, dia_1)


# separando os valores e atribuindo em variaveis diferentes
mes_2, dia_2, ano_2 = [int(f) for f in terminio.split('/')]

# Convertendo os valores em formato datatime
data_nascimento = date(ano_2, mes_2, dia_2)

anos = relativedelta(data_inicial, data_nascimento).years
meses = relativedelta(data_inicial, data_nascimento).months
dias = relativedelta(data_inicial, data_nascimento).days


app_1_anos['text'] = anos
app_2_mes['text'] = meses
app_3_dia['text'] = dias

Desse modo terminamos as funcionalidades essências do nosso aplicativo, agora iremos aplicar um estilo para o aplicativo, que sera:


Enviar um comentário

0 Comentários

Close Menu