menu8.py

Download
import os, datetime, calendar
import customtkinter as ctk
from skyfield.api import Loader, wgs84
from skyfield import almanac

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

class Menu8App(ctk.CTk):
    def __init__(self):
        super().__init__()
        self.title("Sun Times (Modul 8)")
        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 SUNRISE/SET", 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")
        m, y = int(self.entry_m.get()), int(self.entry_y.get())
        lat, lon = float(self.entry_lat.get()), float(self.entry_lon.get())
        tz = 7.0
        
        loc = wgs84.latlon(lat, lon)
        t0 = self.ts.utc(y, m, 1, -int(tz))
        t1 = self.ts.utc(y, m, calendar.monthrange(y, m)[1], 24-int(tz))
        
        f_rs = almanac.sunrise_sunset(self.eph, loc)
        t_rs, y_rs = almanac.find_discrete(t0, t1, f_rs)
        
        self.textbox.insert("end", f"JADWAL MATAHARI - {m}/{y}\n{'='*50}\n")
        self.textbox.insert("end", f"{'Tanggal':<15}{'Sunrise':<15}{'Sunset':<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 = Menu8App()
    app.mainloop()