import os, datetime
import customtkinter as ctk
from skyfield.api import Loader, wgs84
from skyfield import almanac
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
class Menu7App(ctk.CTk):
def __init__(self):
super().__init__()
self.title("Moon Times (Modul 7)")
self.geometry("800x600")
ctk.set_appearance_mode("Dark")
# --- PERBAIKAN SKYFIELD LOADER DI SINI ---
self.load_obj = Loader(BASE_DIR)
self.eph = self.load_obj('de421.bsp')
self.ts = self.load_obj.timescale()
# -----------------------------------------
self.setup_ui()
def setup_ui(self):
self.sidebar = ctk.CTkFrame(self, width=200)
self.sidebar.pack(side="left", fill="y", padx=10, pady=10)
now = datetime.datetime.now()
self.entry_m = ctk.CTkEntry(self.sidebar)
self.entry_m.insert(0, str(now.month))
self.entry_m.pack(pady=5)
self.entry_y = ctk.CTkEntry(self.sidebar)
self.entry_y.insert(0, str(now.year))
self.entry_y.pack(pady=5)
self.entry_lat = ctk.CTkEntry(self.sidebar)
self.entry_lat.insert(0, "-7.0667")
self.entry_lat.pack(pady=5)
self.entry_lon = ctk.CTkEntry(self.sidebar)
self.entry_lon.insert(0, "110.4100")
self.entry_lon.pack(pady=5)
ctk.CTkButton(self.sidebar, text="▶ HITUNG", command=self.hitung).pack(pady=10)
self.textbox = ctk.CTkTextbox(self, font=("Consolas", 14))
self.textbox.pack(side="right", fill="both", expand=True, padx=10, pady=10)
def hitung(self):
self.textbox.delete("1.0", "end")
try:
m = int(self.entry_m.get())
y = int(self.entry_y.get())
lat = float(self.entry_lat.get())
lon = float(self.entry_lon.get())
except ValueError:
self.textbox.insert("end", "Pastikan input angka valid.")
return
tz = 7.0
loc = wgs84.latlon(lat, lon)
t0 = self.ts.utc(y, m, 1, -int(tz))
import calendar
t1 = self.ts.utc(y, m, calendar.monthrange(y, m)[1], 24-int(tz))
f_rs = almanac.risings_and_settings(self.eph, self.eph['moon'], loc)
t_rs, y_rs = almanac.find_discrete(t0, t1, f_rs)
self.textbox.insert("end", f"JADWAL BULAN - {m}/{y}\n{'='*50}\n")
self.textbox.insert("end", f"{'Tanggal':<15}{'Moonrise':<15}{'Moonset':<15}\n{'-'*50}\n")
data = {}
for t, is_rise in zip(t_rs, y_rs):
dt = t.utc_datetime() + datetime.timedelta(hours=tz)
k = dt.day
if k not in data:
data[k] = {'r':'----', 's':'----'}
if is_rise:
data[k]['r'] = dt.strftime("%H:%M")
else:
data[k]['s'] = dt.strftime("%H:%M")
for d in range(1, calendar.monthrange(y, m)[1]+1):
r = data.get(d, {}).get('r', '----')
s = data.get(d, {}).get('s', '----')
self.textbox.insert("end", f"{d:02d}/{m:02d}/{y:<9} {r:<14} {s:<14}\n")
if __name__ == "__main__":
app = Menu7App()
app.mainloop()