menu6.py

Download
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()