from tkinter import *
import ephem
from datetime import datetime
def validar_data(data_str):
try:
data = datetime.strptime(data_str, "%Y/%m/%d")
return data
except ValueError as e:
erro = str(e)
if "does not match format" in erro:
return "⚠️ Formato inválido! Use YYYY/MM/DD."
elif "month must be in" in erro:
return "⚠️ Mês inválido! Deve ser entre 01 e 12."
elif "day is out of range" in erro:
return "⚠️ Dia inválido para o mês informado."
else:
return "⚠️ Data inválida!"
# -------------------------------
# Função principal
# -------------------------------
def app():
data_str = Data.get()
validacao = validar_data(data_str)
if isinstance(validacao, str): # mensagem de erro
resultado_texto.config(text=validacao)
return
try:
lua = ephem.Moon(data_str)
iluminacao = lua.phase # porcentagem iluminada
data_ephem = ephem.Date(data_str)
# Determinar fase da Lua
if iluminacao == 0:
fase = "Lua Nova"
descricao = "A Lua não é visível da Terra."
elif 0 < iluminacao < 50:
if data_ephem < ephem.next_full_moon(data_ephem):
fase = "Crescente"
descricao = "Uma pequena parte da Lua começa a aparecer iluminada."
else:
fase = "Minguante"
descricao = "A parte iluminada está diminuindo após a Lua Cheia."
elif abs(iluminacao - 50) < 0.5:
if data_ephem < ephem.next_full_moon(data_ephem):
fase = "Quarto Crescente"
descricao = "Metade da Lua está iluminada, caminhando para a Lua Cheia."
else:
fase = "Quarto Minguante"
descricao = "Metade da Lua está iluminada, mas agora diminuindo."
elif 50 < iluminacao < 100:
if data_ephem < ephem.next_full_moon(data_ephem):
fase = "Crescente Gibosa"
descricao = "Mais da metade da Lua está iluminada, quase cheia."
else:
fase = "Minguante Gibosa"
descricao = "Após a Lua Cheia, a parte iluminada começa a diminuir."
elif iluminacao == 100:
fase = "Lua Cheia"
descricao = "A Lua está totalmente iluminada e visível a noite inteira."
else:
fase = "Minguante"
descricao = "A parte iluminada continua diminuindo, até a Lua Nova."
mensagem = (f"Data: {data_str}\n"
f"Fase: {fase}\n"
f"Iluminação: {iluminacao:.1f}%\n"
f"Descrição: {descricao}")
resultado_texto.config(text=mensagem)
except Exception as e:
resultado_texto.config(text=f"⚠️ Erro inesperado: {e}")
# -------------------------------
# Funções auxiliares
# -------------------------------
def limpar():
Data_entrada.delete(0, END)
resultado_texto.config(text="")
# -------------------------------
# Interface Tkinter
# -------------------------------
root = Tk()
root.geometry("700x400")
root.resizable(0, 0)
root.config(bg="#103030")
root.title("Fases da Lua")
titulo = Label(text="Fases da Lua",
font=("Arial", 28, "bold"), bg="#103030", fg="#49e3e3")
titulo.place(relx=0.28, rely=0.05)
texto_sub1 = Label(text="Data (YYYY/MM/DD) :",
font=("Arial", 18, "bold"), bg="#103030", fg="#49e3e3")
texto_sub1.place(relx=0.10, rely=0.3)
Data = StringVar()
Data_entrada = Entry(textvariable=Data,
font=("Arial", 12, "bold"),
bg="white", fg="blue", justify='center')
Data_entrada.place(relx=0.5, rely=0.32, relwidth=0.37)
Data_entrada.focus()
but1 = Button(text="Mostrar", bd=2, bg='#107db2', fg='white',
font=('verdana', 12, 'bold'), command=app)
but1.place(relx=0.1, rely=0.45, relwidth=0.25, relheight=0.1)
but_limpar = Button(text="Limpar", bd=2, bg='#107db2', fg='white',
font=('verdana', 12, 'bold'), command=limpar)
but_limpar.place(relx=0.4, rely=0.45, relwidth=0.25, relheight=0.1)
but_sair = Button(text="Sair", bd=2, bg='#107db2', fg='white',
font=('verdana', 12, 'bold'), command=root.destroy)
but_sair.place(relx=0.7, rely=0.45, relwidth=0.25, relheight=0.1)
resultado_texto = Label(text="",
font=("Arial", 12, "bold"), bg="#cfe2f3",
justify="left", anchor="nw")
resultado_texto.place(relx=0.05, rely=0.6, relwidth=0.9, relheight=0.28)
root.mainloop()
Comentários
Enviar um comentário