Ringrazio per le sue preziose indicazioni.
Io sono un autodidatta che ha iniziato a programmare con il Basic dello Spectrum passando poi per il Clipper Pascal e VB6 poi Vbscript, Javascript (Java,C,C++c# di striscio) e infine Python
Non utilizzo la programmazione ad oggetti perché mi è ostica, non ho gli studi appropriati e anche perché la programmazione non è un lavoro per me, ma un graditissimo passatempo.
Grazie per la disponibilità
Questa è roba fatta da me non copiata . Mi perdonerà l'ingenuità della programmazione
p.s. ho iniziato ad usare Python con la pandemia
##############################################
# CACOLO DEL JULIAN DAY #
# e vicecersa #
# Formula di Meeus #
#############################################
'''
APERTURA DELLE LIBRERIE
'''
from tkinter import *
import tkinter as tk
from tkinter import ttk
import shutil
import datetime
from datetime import date
import time
import os
import sys
from tkinter import messagebox
import tkinter.simpledialog as simpledialog
from tkinter.simpledialog import askstring
from tkinter.messagebox import showinfo
###################################################
wd = os.getcwd() # Percorso di dove mi trovo
pro ="JylianDay.py"
proc = "\\"+pro
PathAll = wd + proc # Percorso + Nome programma
#####-------- Creo una Cartella MyTest --------
Cartella = wd +"\\MyTest"
if not os.path.exists(Cartella):
os.makedirs(Cartella)
##--------- Definisco Le variabili Globali
gio = 0
mes = 0
ann = 0
jdy = 0
hho = 0
mmo = 0
sso = 0
shho = ""
smmo = ""
so = ""
GioH = 0
sgio = ""
smes = ""
sann = ""
giomax = 28
giosett = "" #"Sabato"
bize =""
bise = False
data = ""
ora = ""
spaz = " "
Jdy = 0
titolasso =""
global Mega
Mega = []
days = []
days = ["Domenica ","Lunedi' ","Martedi' ","Mercoledi' ","Giovedi' ","Venerdi' ","Sabato "]
############## ZONA FUNZIONI #########################
#----------------------------------------------------------------------------------------------------------
def cmdJulian(): # pulsante
######################### Splitto l'Ora
varora = txtOra.get()
#if len(varora)==0:
# return
if varora == "0" or len(varora) == 0:
varora = "00.00.00"
if len(varora) < 8:
messagebox.showwarning(title="Errore", message="Formato Orario hh.mm.ss")
return
puntiOra = varora.count(".")
if puntiOra==2:
varora = varora.replace(".",":") #Formato Orario
varora = varora.replace(",",".") # eventuali decimali
######################### C.llo e Splitto la Data
vardata = txtData.get()
# i due campi sono vuoti
if len(vardata) == 0:
messagebox.showwarning(title="Errore", message="Inserisci sempre la Data gg/mm/aaa")
return
ArData = vardata.split("/")
sla = vardata.count("/")
if sla >2 or sla <2:
messagebox.showwarning(title="Errore", message="Errore!!! Correggi l'Input della Data")
return
#-------- Stringhe Data
sgio = ArData[0] # Giorno
smes = ArData[1] # mese
sann = ArData[2] # anno
#-------- Valori Data
gio = int(sgio)
mes = int(smes)
if mes >12:
messagebox.showwarning(title="Errore", message="Errore nell'inserimento del Mese")
return
ann = int(sann)
if ann >= 9999:
messagebox.showwarning(title="Errore", message="Errore nell'inserimento dell'Anno")
return
bize =""
bise = False
bise = Bisestile(ann) # Anno esatto
if bise == True:
bize = "[Bisestile]"
#--------------------------------
giomax= GioMax(mes,bise)
if gio > giomax or gio >31:
messagebox.showwarning(title="Errore", message="Errore nell'inserimento del Giorno")
return
ArOra = varora.split(":")
#-------- Stringhe Ora
shho = ArOra[0]
smmo = ArOra[1]
ssso = ArOra[2]
#-------- Valori Ora
hho = int(shho) # Ora
if hho >24:
messagebox.showwarning(title="Errore", message="Errore!!!\n\n Inserire un Orario <= 23.59.59")
return
mmo = int(smmo) # minuti
sso = float(ssso) # secondi
print("sso : ",sso)
#------------------------------------- controllo ora
if int(sso) >= 60:
sso -=60
mmo +=1
logi = True
if sso == 60:
sso = (sso - 60)
if mmo >= 60:
mmo -=60
hho +=1
logi = True
if mmo == 60:
mmo = (mmo-60)
if hho >= 24:
hho -=24
gio +=1
if gio > giomax:
gio = gio-giomax
mes+=1
if mes > 12:
mes = mes-12
ann+=1
Secondi = ((hho*3600) + (mmo*60) + sso)
if Secondi >= 86400:
Secondi -=86400
s1 = Secondi/3600
hho = int(s1)
s2 = s1-sso
s3 = s2*60
mmo = int(s3)
s4 = s3-mmo
sso = s4*60
gio +=1
oH = OreGiorno(hho,mmo,sso)
GioH = float(oH /86400)
#Ricostruzione Data e Ora
Dda = str(gio)+"/"+str(mes)+"/"+str(ann)
seco = str(int(sso))
Oor = zero(str(hho))+":"+zero(str(mmo))+":"+zero(seco)
# Metto i nuovi valori nelle Entry di input
Gdata.set(Dda)
Gora.set(Oor)
#### Preparo il valore giorno per il calcolo del gilian day
xgio = gio + GioH
Jdy = float(JulianDay(xgio,mes,ann))
jdm = Jdy +1.5
xg = int(jdm % 7)
# Giorno della settimana
giosett = str(days[xg]).strip()
jday.set(Jdy)
Mega.clear() # Svuota la Lista
Mega.append("Da Gregorian Day a Julian Day")
Mega.append(Dda)
Mega.append(Oor)
Mega.append(Jdy)
Mega.append(giosett)
Mega.append(False)
lbl2 = Label(text= " ",font=("Courier 10 italic bold "))
lbl2 = Label(text= giosett ,font=("Courier 10 italic bold "))
lbl2.place(x=130, y=160)
return
#--------------------------------------------------------------
def GioMax(mes,bi):
switcher = {
1: 31,
2: 28,
3: 31,
4: 30,
5: 31,
6: 30,
7: 31,
8: 31,
9: 30,
10: 31,
11: 30,
12: 31,}
gmes = switcher.get(mes, "Invalid month")
if mes ==2 and bi==True:
gmes = 29
return gmes
#--------------------------------------Calcolo Ore in secondi
def OreGiorno(hho,mmo,sso):
hhh = (((hho * 60)+mmo)*60) +sso
return hhh
#--------------------------------------Calcolo Gulian day
def JulianDay(xgio,mes,ann):
a=0
b=0
d = xgio
ms = mes
xms = mes
Y = ann
xan = ann
if(xms == 1 or xms == 2):
xan -=1
xms +=12
dd = int(xgio)
if(xan > 1852):
a = int(xan/100)
b = 2 - a + int(a/4)
if(xan < 1852):
b = 0
VA0 = float(4716.00)
z = xan +VA0
J = xms +1
VA1 = float(365.25)
VA2 = float(30.6001)
ii = int(VA1 * z)
jj = int(VA2 * J)
VA3 = float(1524.5)
vv = float(d + b - VA3)
pio = float(ii + jj + vv)
Somma = float(pio)
txtData.focus_set()
return Somma
#---------------------------------------------------------------------
def cmdGregorian(): # Pulsante Gog
jd = jday.get() # legge il Campo Entry
print(jd)
if len(jd) == 0:
return
JdToDg = DataGreg(jd)
print(JdToDg)
dhg = JdToDg.split("x")
LaData = dhg[0]
LaOra = ControlloOra(dhg[1])
ilGio = dhg[2]
Gdata.set(LaData)
Gora.set(LaOra)
Mega.clear()
Mega.append("Da Julian Day a Gregorian Day")
Mega.append(jd)
Mega.append(LaData)
Mega.append(LaOra)
Mega.append(ilGio)
Mega.append(True)
lbl2 = Label(text= " ",font=("Courier 10 italic bold "))
lbl2 = Label(text= ilGio ,font=("Courier 10 italic bold "))
lbl2.place(x=130, y=160)
# se una cifra, anreporre 0 / Togliere i decimali
# vedo se ci sono decimali
return
#--------------------------
def ControlloOra(H):
oraDec = H.split(".")
oraInt = oraDec[0]
hms =oraInt.split(":")
oo = ""
for i in hms:
i=i.strip()
if len(i) == 1:
i =zero(i)+":"
else:
i = i+":"
oo = oo+i
oo = oo[:-1]
return oo
#--------------------------
def zero(x):
if len(x)==1:
return('0' +x)
return x
#------------ 1721058 01/01/000 12:00:00 Giovedì
def DataGreg(jj):
jj = float(jj)
z = 0
F = 0
a = 0
B = 0
C = 0
d = 0
e = 0
alfa = 0
mm1 = 0
yy1 = 0
va1 = 1867216.25
va2 = 36524.25
va3 = 1524
va4 = 122.1
va5 = 365.25
va6 = 30.6001
va7 = 4716
va8 = 4715
Konstz = 2299161
J1 = float(jj + 0.5)
z = int(J1)
F = float(J1 - int(J1))
if z < Konstz:
a = z
if z >= Konstz:
alfa = int((z - va1) / va2)
a = z + 1 + alfa - int(alfa / 4)
B = (a + va3)
C = int((B - va4) / va5)
d = int(va5 * C)
e = int((B - d) / va6)
Dd1 = (B - d - int(va6 * e) + F)
#**** Mese
if e < 14:
mm1 = (e - 1)
if e == 14 or e == 15:
mm1 = (e - 13)
#**** Anno
if mm1 > 2:
yy1 = (C - va7)
if mm1 == 1 or mm1 == 2:
yy1 = (C - va8)
# Creo la Stringa della Data
DDD = str(int(Dd1)) + "/" + str(mm1) + "/" + str(yy1)
###-----------------------------------------------------
bize =""
bise = False
bise = Bisestile(int(Dd1)) # Anno Bisestile?
bize = "[Bisestile]"
jdm = jj +1.5
xg = int(jdm % 7)
giosett = days[xg] # Giorno della settimana letto dall'Array days[]
# Calcolo dell'Orario con i secondi decimali
HO = Dd1 - int(Dd1)
h = HO * 24
Hora = int(h)
mi = h - int(h)
mi = mi * 60
mii = int(mi)
se = mi - int(mi)
se = se * 60
Sec = float(se)
#Orario = str(Hora) + ":" + str(mii) + ":" + str(Sec)[0:6] #limito a tre decimali
Orario = str(Hora) + ":" + str(mii) + ":" + str(round(Sec,4)) #limito a tre decimali
return DDD + "x" + Orario + "x" + giosett
#---------------------------------------BISESTILE
def Bisestile(yea):
ve = False
if yea %4 == 0:
ve = ((yea % 100)>0 or ((yea % 400) == 0))
else:
ve = False
return ve
#---------------------------------------USCITA
def cmdEsco():
os._exit(0)
###---------------- PULIZIA DEI CAMPI ------------
def cmdClear():
txtData.delete(0,END)
txtOra.delete(0,END)
txtJd.delete(0,END)
lbl2 = Label(text= 20*" " ,font=("Courier 10 italic bold "))
lbl2.place(x=130, y=160)
txtData.focus_set()
lbl3 = Label(text= " " ,font=("Courier 7 bold "))
lbl3.place(x=130, y=180)
Mega.clear()
txtData.focus_set()
##------------------------------------------------------------------------
def cmdReport():
titolo = ""
rep = ""
if Mega[5] == True:
rep = rep+Mega[0]+"\n\nJulian Day\t = "+Mega[1]+"\nData\t\t = "
rep = rep+Mega[2]+"\nOra\t\t = "+Mega[3]+"\nGiorno\t\t = "+Mega[4]
messagebox.showinfo("Data Giuliana",rep)
if Mega[5] == False:
rep = rep+Mega[0]+"\n\nData\t\t = "+Mega[1]+"\nOra\t\t = "+Mega[2]
rep = rep+"\nGiorno\t\t = "+Mega[4]+"\nJulian Day\t = "+str((Mega[3]))
messagebox.showinfo("Data Giuliana",rep)
return
#----------------------------------------------------------------------
############## ZONA WINDOW #########################
#inizializziamo globalmente la finestra
window = Tk()
#dimensioni Finestra
WIDTH = 400 #larghezza
HEIGHT = 200 #Altezza
###------------------- CENTRO FINESTRA SU SHERMO ---------------------
larghezza = window.winfo_screenwidth() # larghezza schermo in pixel
altezza = window.winfo_screenheight() # altezza schermo in pixel
x = larghezza//2 - WIDTH//2
y = altezza//2 - HEIGHT//2
window.geometry("%dx%d+%d+%d" % (WIDTH, HEIGHT, x, y))
window.title("Calcolo del Julian Day By GSan 02/2021 Python 3.9 64 Bit")
#window.resizable(False, False) # non modificabile e no ingrandisce
#window.resizable(0,0) # non modificabile e no ingrandisce
#window.overrideredirect(1) # non spostabile e senza i controlli
window.attributes("-topmost", True) # sempre in primo piano
#---------------------------------------------------------------------------
### ---------------- Creo un riquadro Frame chiamato "gruppo"
gruppo = LabelFrame(window, text="Gregorian Day",fg='navy',font=("Arial 10 bold"), padx=5, pady=5, width=300)
gruppo.grid(row=0, sticky='W', padx=55, pady=5, ipadx=5, ipady=5)
# Il Frame si allunga mano a mano che inserisco oggetti
gru = LabelFrame(window, text="Julian Day",fg='navy',font=("Arial 10 bold"), padx=5, pady=5, width=300)
gru.grid(row=1, sticky='W', padx=55, pady=5, ipadx=5, ipady=5)
#Label e Campo Entry
Gdata = StringVar()
Gora = StringVar()
jday = StringVar()
#Mega=[]
Label(gru, text="J.Day : ",font=("Arial 10 bold italic")).grid(row=0, sticky=W)
txtJd = Entry(gru, textvariable=jday, bg="azure",font=("Arial 10 bold "), width=18)
txtJd.grid(row=0, column=1, sticky=W)
txtJd.focus_set()
Label(gruppo, text="Data : ",font=("Arial 10 bold italic")).grid(row=0, sticky=W)
Label(gruppo, text=" gg/mm/aaa ",font=("Arial 8 italic")).grid(row=0,column=2, sticky=W)
txtData = Entry(gruppo, textvariable=Gdata, bg="azure",font=("Arial 10 bold "), width=12)
txtData.grid(row=0, column=1, sticky=W)
txtData.focus_set()
Label(gruppo, text="Ora : ",font=("Arial 10 bold italic")).grid(row=1, sticky=W)
Label(gruppo, text=" hh:mm:ss ",font=("Arial 8 italic")).grid(row=1,column=2, sticky=W)
txtOra = Entry(gruppo, textvariable=Gora, bg="azure",font=("Arial 10 bold "), width=12)
txtOra.grid(row=1, column=1, sticky=W)
# Pulsanti Invio e Chiusura
###--- Pulsante di Calcolo del Julian Day---------------------------
cmdEnter = Button(gruppo, text='J d y',fg='navy',bg='lightgray',font=("Arial 7 italic "),cursor ="hand2", command=cmdJulian)
cmdEnter.grid(row=1,column=4, sticky=W) #.place(x=260, y=60)
###--- Pulsante di Calcolo del Gregorian Day---------------------------
Label(gru, text=" ",font=("Arial 10 bold italic")).grid(row=0,column= 4, sticky=W)
cmdEnteg = Button(gru, text='G r g',fg='navy',bg='lightgrey',font=("Arial 7 italic "),cursor ="hand2", command=cmdGregorian)
cmdEnteg.grid(row=0,column=5, sticky=W) #.place(x=260, y=60)
#------ PULISCE CAMPI
cmdPuli = Button(window, text='C L E A R',fg='navy',bg='lime',font=("Arial 6"),cursor ="hand2", command=cmdClear)
cmdPuli.place(x=215, y=89)
#------ Crea Report
cmdPuli = Button(window, text='R E P O R T',fg='white',bg='dimgrey',font=("Arial 6"),cursor ="hand2", command=cmdReport)
cmdPuli.place(x=140, y=89)
###--- Pulsante Uscita Programma ----------------------
cmdEsci = Button(window, text='E X I T',bg='orange',font=("Arial 6"),cursor ="hand2", command=cmdEsco)
cmdEsci.place(x=280,y=89)#315 160
#cmdEsci.place(x=268,y=180)
if __name__ == "__main__":
window.mainloop()