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()
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:

0 Comentários