import os, datetime
import customtkinter as ctk
from skyfield.api import Loader
from skyfield import almanac
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
class Menu6App(ctk.CTk):
def __init__(self):
super().__init__()
self.title("Kalkulator Fase Bulan (Modul 6)")
self.geometry("900x600")
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)
self.entry_y = ctk.CTkEntry(self.sidebar, placeholder_text="Tahun (Masehi)")
self.entry_y.insert(0, str(datetime.datetime.now().year))
self.entry_y.pack(pady=20, padx=10)
ctk.CTkButton(self.sidebar, text="▶ HITUNG FASE", 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:
y = int(self.entry_y.get())
except ValueError:
self.textbox.insert("end", "Masukkan tahun yang valid (Angka).")
return
t0 = self.ts.utc(y, 1, 1)
t1 = self.ts.utc(y, 12, 31)
t_phases, y_phases = almanac.find_discrete(t0, t1, almanac.moon_phases(self.eph))
self.textbox.insert("end", f"FASE BULAN TAHUN {y}\n{'='*70}\n")
self.textbox.insert("end", f"{'New Moon':<20}{'First Quarter':<20}{'Full Moon':<20}{'Last Quarter':<20}\n")
self.textbox.insert("end", "-"*70 + "\n")
row = ["", "", "", ""]
for t, p in zip(t_phases, y_phases):
dt = t.utc_datetime() + datetime.timedelta(hours=7) # Konversi ke WIB (UTC+7)
row[p] = dt.strftime("%d/%m %H:%M")
if p == 3:
self.textbox.insert("end", f"{row[0]:<20}{row[1]:<20}{row[2]:<20}{row[3]:<20}\n")
row = ["", "", "", ""]
if any(row):
self.textbox.insert("end", f"{row[0]:<20}{row[1]:<20}{row[2]:<20}{row[3]:<20}\n")
if __name__ == "__main__":
app = Menu6App()
app.mainloop()