Animation d'une éclipse

Contenu du snippet

"""
Animation d'une éclipse avec les touches de direction
éclipse de soleil totale visible en France le 3 septembre 2081
éclipse complète le 23 septembre 2090
éclipse solaire partielle visibles en France le 29 mars 2025 et le 12 août 2026
"""
from tkinter import *
import math
import ephem

o=ephem.Observer()
o.date='2023/10/14 17:55:00' # UTC eclipse de soleil
o.date='2081/09/03 06:35:00' # UTC eclipse de soleil
o.date='2090/09/23 16:44:00' # UTC eclipse de soleil

o.date='1999/08/11 09:15:00' # UTC eclipse de soleil

#o.lat='48.866667' # latitude pour Paris
#o.lon= '2.333333' # longitude pour Paris
#o.elevation=-6371000 # observateur au centre de la terre
o.lat='43.7'   # Nice
o.lon= '7.23' # Nice
o.elevation=0 # en mètre

zoom=900
h=3*180
w=h # 3*360
w2=w//2
h2=h//2

couleurs=['red','black'] # soleil, lune

def zodiaque(t):
    if t=="Ari":return "♈"#    Bélier
    if t=="Tau":return "♉"# Taureau
    if t=="Gem":return "♊"# Gémeaux
    if t=="Cnc":return "♋"# Cancer
    if t=="Leo":return "♌"# Lion
    if t=="Vir":return "♍"# Vierge
    if t=="Lib":return "♎"# Balance
    if t=="Sco":return "♏"# Scorpion
    if t=="Sgr":return "♐"# Sagittaire
    if t=="Cap":return "♑"# Capricorne
    if t=="Aqr":return "♒"# Verseau
    if t=="Psc":return "♓"# Poisson

def circle(n):
    global h2,w2,astres,o
    ast=astres[n]
    constel=ephem.constellation(ast)[0]
    x=math.degrees(ast.az-astres[0].az)
    y=math.degrees(ast.alt-astres[0].alt)
    diametre=ast.size * 0.000277778 # en seconde " traduit en °
    rayon=diametre/2
    rayon*=zoom
    print(x,'°,',y,'°,',diametre,zodiaque(constel),constel,o.date,'UTC',math.degrees(astres[n].elong),'°')
    x*=zoom
    y*=zoom
    x1=w2+(x-rayon)
    y1=h2-(y-rayon)
    x2=w2+(x+rayon)
    y2=h2-(y+rayon)
    cnvs.create_oval(x1,y1,x2,y2,fill=couleurs[n],outline=couleurs[n])

def affiche():
    global o,astres,drapeau #drapeau pour ne pas chevaucher les events key, b1 et b2
    fen.title(ephem.localtime(o.date).strftime("%d/%m/%Y %H:%M:%S"))
    print(o.date)
    astres=[ephem.Sun(o),ephem.Moon(o)]
    cnvs.delete('all')
    for n in range(2):circle(n)
    drapeau=False

def key(e):
    global drapeau,o
    if drapeau:return
    drapeau=True
    if(e.keysym=='Left'):o.date-=ephem.second
    elif(e.keysym=='Right'):o.date+=ephem.second
    elif(e.keysym=='Up'):o.date+=ephem.minute
    elif(e.keysym=='Down'):o.date-=ephem.minute
    elif(e.keysym=='space'):o.date=ephem.now()
    elif(e.keysym=='j+'):o.date+=24*ephem.hour
    elif(e.keysym=='j-'):o.date-=24*ephem.hour
    elif(e.keysym=='a'):o.date-=8760*ephem.hour
    elif(e.keysym=='A'):o.date+=8760*ephem.hour
    else:
        drapeau=False
        return
    print()
    affiche()

def b1(e):
    e.keysym='j-'
    key(e)

def b3(e):
    e.keysym='j+'
    key(e)

fen = Tk()

fen.bind("<Key>",key)
#fen.bind('<Button-1>',b1)
#fen.bind('<Button-3>',b3)

cnvs=Canvas(fen,width=w,height=h)
cnvs.pack()

""""""
def Nice():
    o.lat='43.7'
    o.lon= '7.25'
    o.elevation=0
    print('nNice',o.lon,o.lat)
    affiche()
    return
def Paris():
    o.lat='48.866667'
    o.lon= '2.333333'
    o.elevation=0
    print('nParis',o.lon,o.lat)
    affiche()
    return
def Centre():
    o.lat='0.0'
    o.lon='0.0'
    o.elevation=-6371000
    print('nCentre de la terre')
    affiche()
    return
def _1999():
    o.date='1999/08/11 09:15:00'
    affiche()
    return
def _2023():
    o.date='2023/10/14 17:55:00'
    affiche()
    return
def _2081():
    o.date='2081/09/03 06:35:00'
    affiche()
    return
def _2090():
    o.date='2090/09/23 16:44:00'
    affiche()
    return
def maintenant():
    o.date=ephem.now()
    affiche()
    return
menu_bar=Menu(fen)
menu_file = Menu(menu_bar, tearoff=0)
menu_file.add_command(label="Observateur au centre de la terre",underline=0,accelerator="O",command=Centre)
menu_file.add_command(label="Nice",underline=0,accelerator="N",command=Nice)
menu_file.add_command(label="Paris",underline=0,accelerator="P",command=Paris)
menu_file.add_separator()
menu_file.add_command(label="1999",underline=0,accelerator="1",command=_1999)
menu_file.add_command(label="2023",underline=0,accelerator="2",command=_2023)
menu_file.add_command(label="2081",underline=0,accelerator="8",command=_2081)
menu_file.add_command(label="2090",underline=0,accelerator="9",command=_2090)
menu_file.add_command(label="Maintenant",underline=0,accelerator="M",command=maintenant)
menu_file.add_separator()
menu_file.add_command(label="Quitter",underline=0,accelerator="Q",command=fen.destroy)
menu_bar.add_cascade(label="Choix",underline=0,accelerator="Alt+C",menu=menu_file)
fen.config(menu=menu_bar)
""""""

affiche()

fen.mainloop()

A voir également