menu9.py

Download
import os, datetime, math
import numpy as np
import customtkinter as ctk
from skyfield.api import Loader, wgs84

BASE_DIR = os.path.dirname(os.path.abspath(__file__))

class Menu9App(ctk.CTk):
    def __init__(self):
        super().__init__()
        self.title("Ephemeris Raw Data (Modul 9)")
        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=250)
        self.sidebar.pack(side="left", fill="y", padx=10, pady=10)
        
        self.combo_obj = ctk.CTkOptionMenu(self.sidebar, values=["Sun", "Moon"])
        self.combo_obj.pack(pady=10)
        
        self.entry_y = ctk.CTkEntry(self.sidebar); self.entry_y.insert(0, "2026"); self.entry_y.pack(pady=5)
        self.entry_m = ctk.CTkEntry(self.sidebar); self.entry_m.insert(0, "3"); self.entry_m.pack(pady=5)
        self.entry_d = ctk.CTkEntry(self.sidebar); self.entry_d.insert(0, "17"); self.entry_d.pack(pady=5)
        
        ctk.CTkButton(self.sidebar, text="▶ EKSTRAK DATA (24 Jam)", command=self.hitung).pack(pady=20)
        self.textbox = ctk.CTkTextbox(self, font=("Consolas", 12), wrap="none")
        self.textbox.pack(side="right", fill="both", expand=True, padx=10, pady=10)

    def hitung(self):
        self.textbox.delete("1.0", "end")
        obj_target = self.combo_obj.get()
        target = self.eph['sun'] if obj_target == "Sun" else self.eph['moon']
        
        y, m, d = int(self.entry_y.get()), int(self.entry_m.get()), int(self.entry_d.get())
        tz = 7.0
        loc = wgs84.latlon(-7.0667, 110.4100) # Default Toposentrik
        
        t0 = self.ts.utc(y, m, d, -int(tz))
        t1 = self.ts.utc(y, m, d, 24-int(tz))
        tt_array = np.linspace(t0.tt, t1.tt, 25) # 24 data point (tiap jam)
        
        self.textbox.insert("end", f"EPHEMERIS {obj_target.upper()} (Toposentrik)\n{'='*80}\n")
        self.textbox.insert("end", f"{'Jam':<10}{'R.A (Hours)':<15}{'Declination':<15}{'Altitude':<15}{'Distance (km)'}\n{'-'*80}\n")
        
        for tt in tt_array:
            t = self.ts.tt_jd(tt)
            app = (self.eph['earth'] + loc).at(t).observe(target).apparent()
            ra, dec, dist = app.radec()
            alt, az, _ = app.altaz()
            
            dt_lokal = t.utc_datetime() + datetime.timedelta(hours=tz)
            jam_str = dt_lokal.strftime("%H:%M")
            
            ra_val = ra.hours.item() if hasattr(ra.hours, 'item') else ra.hours
            dec_val = dec.degrees.item() if hasattr(dec.degrees, 'item') else dec.degrees
            
            self.textbox.insert("end", f"{jam_str:<10}{ra_val:<15.4f}{dec_val:<15.4f}{alt.degrees:<15.4f}{dist.km:,.1f}\n")

if __name__ == "__main__":
    app = Menu9App()
    app.mainloop()