import os, datetime, math, threading
import customtkinter as ctk
from tkinter import messagebox
import ephem
# =========================================================================
# ---> PENTING: SILAKAN COPAS HIJRI_DB LENGKAP DARI KODE MASTER ANDA <---
# Di bawah ini hanya sampel struktur agar script bisa berjalan.
# Pastikan indeks 8 (Bulan ke-9 / Ramadhan) valid formatnya: ["Ramadan", "Hari", "DD-MMM-YYYY", 30]
# =========================================================================
HIJRI_DB = {
1446: [["Muharam", "Ahad Kliwon", "07-Jul-2024", 29], ["Safar", "Senin", "05-Aug-2024", 30], ["Rabiulawal", "Rabu", "04-Sep-2024", 30], ["Rabiulakhir", "Jumat", "04-Oct-2024", 30], ["Jumadilawal", "Ahad", "03-Nov-2024", 29], ["Jumadilakhir", "Senin", "02-Dec-2024", 30], ["Rajab", "Rabu", "01-Jan-2025", 30], ["Syakban", "Jumat", "31-Jan-2025", 29], ["Ramadan", "Sabtu", "01-Mar-2025", 30], ["Syawal", "Ahad", "31-Mar-2025", 30], ["Zulkaidah", "Selasa", "29-Apr-2025", 29], ["Zulhijah", "Rabu", "28-May-2025", 29]],
1447: [["Muharam", "Kamis Wage", "26-Jun-2025", 30], ["Safar", "Sabtu Wage", "26-Jul-2025", 29], ["Rabiulawal", "Ahad Pon", "24-Aug-2025", 30], ["Rabiulakhir", "Selasa Pon", "23-Sep-2025", 30], ["Jumadilawal", "Kamis Pon", "23-Oct-2025", 29], ["Jumadilakhir", "Jumat Pahing", "21-Nov-2025", 30], ["Rajab", "Ahad Pahing", "21-Dec-2025", 30], ["Syakban", "Selasa Pahing", "20-Jan-2026", 29], ["Ramadan", "Rabu Legi", "18-Feb-2026", 30], ["Syawal", "Jumat Legi", "20-Mar-2026", 29], ["Zulkaidah", "Sabtu Kliwon", "18-Apr-2026", 30], ["Zulhijah", "Senin Kliwon", "18-May-2026", 29]],
1448: [["Muharam", "Selasa Wage", "16-Jun-2026", 29], ["Safar", "Rabu", "15-Jul-2026", 29], ["Rabiulawal", "Kamis", "13-Aug-2026", 30], ["Rabiulakhir", "Sabtu", "12-Sep-2026", 30], ["Jumadilawal", "Senin", "12-Oct-2026", 29], ["Jumadilakhir", "Selasa", "10-Nov-2026", 30], ["Rajab", "Kamis", "10-Dec-2026", 30], ["Syakban", "Sabtu", "09-Jan-2027", 30], ["Ramadan", "Senin", "08-Feb-2027", 29], ["Syawal", "Selasa", "09-Mar-2027", 30], ["Zulkaidah", "Kamis", "08-Apr-2027", 29], ["Zulhijah", "Jumat Wage", "07-May-2027", 30]],
1449: [["Muharam", "Ahad Wage", "06-Jun-2027", 29], ["Safar", "Senin", "05-Jul-2027", 29], ["Rabiulawal", "Selasa", "03-Aug-2027", 30], ["Rabiulakhir", "Kamis", "02-Sep-2027", 29], ["Jumadilawal", "Jumat", "01-Oct-2027", 30], ["Jumadilakhir", "Ahad", "31-Oct-2027", 29], ["Rajab", "Senin", "29-Nov-2027", 30], ["Syakban", "Rabu", "29-Dec-2027", 29], ["Ramadan", "Jumat", "28-Jan-2028", 30], ["Syawal", "Sabtu", "26-Feb-2028", 30], ["Zulkaidah", "Senin", "27-Mar-2028", 30], ["Zulhijah", "Rabu", "26-Apr-2028", 29]],
1450: [["Muharam", "Kamis", "25-May-2028", 30], ["Safar", "Sabtu", "24-Jun-2028", 29], ["Rabiulawal", "Ahad", "23-Jul-2028", 29], ["Rabiulakhir", "Senin", "21-Aug-2028", 30], ["Jumadilawal", "Rabu", "20-Sep-2028", 29], ["Jumadilakhir", "Kamis", "19-Oct-2028", 30], ["Rajab", "Sabtu", "18-Nov-2028", 29], ["Syakban", "Ahad", "17-Dec-2028", 30], ["Ramadan", "Selasa", "16-Jan-2029", 29], ["Syawal", "Rabu", "14-Feb-2029", 30], ["Zulkaidah", "Jumat", "16-Mar-2029", 30], ["Zulhijah", "Ahad", "15-Apr-2029", 29]],
1451: [["Muharam", "Senin", "14-May-2029", 30], ["Safar", "Rabu", "13-Jun-2029", 29], ["Rabiulawal", "Kamis", "12-Jul-2029", 30], ["Rabiulakhir", "Sabtu", "11-Aug-2029", 29], ["Jumadilawal", "Ahad", "09-Sep-2029", 30], ["Jumadilakhir", "Selasa", "09-Oct-2029", 29], ["Rajab", "Rabu", "07-Nov-2029", 30], ["Syakban", "Jumat", "07-Dec-2029", 29], ["Ramadan", "Sabtu", "05-Jan-2030", 30], ["Syawal", "Senin", "04-Feb-2030", 29], ["Zulkaidah", "Selasa", "05-Mar-2030", 30], ["Zulhijah", "Kamis", "04-Apr-2030", 29]],
1452: [["Muharam", "Jumat", "03-May-2030", 30], ["Safar", "Ahad", "02-Jun-2030", 30], ["Rabiulawal", "Selasa", "02-Jul-2030", 30], ["Rabiulakhir", "Kamis", "01-Aug-2030", 29], ["Jumadilawal", "Jumat", "30-Aug-2030", 29], ["Jumadilakhir", "Sabtu", "28-Sep-2030", 30], ["Rajab", "Senin", "28-Oct-2030", 29], ["Syakban", "Selasa", "26-Nov-2030", 30], ["Ramadan", "Kamis", "26-Dec-2030", 29], ["Syawal", "Jumat", "24-Jan-2031", 29], ["Zulkaidah", "Sabtu", "22-Feb-2031", 30], ["Zulhijah", "Senin", "24-Mar-2031", 30]],
1453: [["Muharam", "Rabu", "23-Apr-2031", 29], ["Safar", "Kamis", "22-May-2031", 30], ["Rabiulawal", "Sabtu", "21-Jun-2031", 30], ["Rabiulakhir", "Senin", "21-Jul-2031", 29], ["Jumadilawal", "Selasa", "19-Aug-2031", 30], ["Jumadilakhir", "Kamis", "18-Sep-2031", 29], ["Rajab", "Jumat", "17-Oct-2031", 30], ["Syakban", "Ahad", "16-Nov-2031", 30], ["Ramadan", "Senin", "15-Dec-2031", 29], ["Syawal", "Rabu", "14-Jan-2032", 29], ["Zulkaidah", "Kamis", "12-Feb-2032", 29], ["Zulhijah", "Jumat", "12-Mar-2032", 30]],
1454: [["Muharam", "Ahad", "11-Apr-2032", 30], ["Safar", "Selasa", "11-May-2032", 29], ["Rabiulawal", "Rabu", "09-Jun-2032", 30], ["Rabiulakhir", "Jumat", "09-Jul-2032", 29], ["Jumadilawal", "Sabtu", "07-Aug-2032", 30], ["Jumadilakhir", "Senin", "06-Sep-2032", 29], ["Rajab", "Selasa", "05-Oct-2032", 30], ["Syakban", "Kamis", "04-Nov-2032", 30], ["Ramadan", "Sabtu", "04-Dec-2032", 30], ["Syawal", "Ahad", "02-Jan-2033", 29], ["Zulkaidah", "Selasa", "01-Feb-2033", 29], ["Zulhijah", "Rabu", "02-Mar-2033", 30]],
1455: [["Muharam", "Jumat", "01-Apr-2033", 29], ["Safar", "Sabtu", "30-Apr-2033", 29], ["Rabiulawal", "Ahad", "29-May-2033", 30], ["Rabiulakhir", "Selasa", "28-Jun-2033", 29], ["Jumadilawal", "Rabu", "27-Jul-2033", 30], ["Jumadilakhir", "Jumat", "26-Aug-2033", 29], ["Rajab", "Sabtu", "24-Sep-2033", 30], ["Syakban", "Senin", "24-Oct-2033", 30], ["Ramadan", "Rabu", "23-Nov-2033", 30], ["Syawal", "Jumat", "23-Dec-2033", 29], ["Zulkaidah", "Sabtu", "21-Jan-2034", 30], ["Zulhijah", "Senin", "20-Feb-2034", 29]],
1456: [["Muharam", "Selasa", "21-Mar-2034", 30], ["Safar", "Kamis", "20-Apr-2034", 29], ["Rabiulawal", "Jumat", "19-May-2034", 29], ["Rabiulakhir", "Sabtu", "17-Jun-2034", 30], ["Jumadilawal", "Senin", "17-Jul-2034", 29], ["Jumadilakhir", "Selasa", "15-Aug-2034", 29], ["Rajab", "Rabu", "13-Sep-2034", 30], ["Syakban", "Jumat", "13-Oct-2034", 30], ["Ramadan", "Ahad", "12-Nov-2034", 30], ["Syawal", "Selasa", "12-Dec-2034", 30], ["Zulkaidah", "Kamis", "11-Jan-2035", 29], ["Zulhijah", "Jumat", "09-Feb-2035", 30]],
1457: [["Muharam", "Ahad", "11-Mar-2035", 29], ["Safar", "Senin", "09-Apr-2035", 30], ["Rabiulawal", "Rabu", "09-May-2035", 29], ["Rabiulakhir", "Kamis", "07-Jun-2035", 29], ["Jumadilawal", "Jumat", "06-Jul-2035", 29], ["Jumadilakhir", "Sabtu", "04-Aug-2035", 30], ["Rajab", "Senin", "03-Sep-2035", 30], ["Syakban", "Rabu", "03-Oct-2035", 29], ["Ramadan", "Kamis", "01-Nov-2035", 30], ["Syawal", "Sabtu", "01-Dec-2035", 30], ["Zulkaidah", "Senin", "31-Dec-2035", 30], ["Zulhijah", "Rabu", "30-Jan-2036", 29]],
1458: [["Muharam", "Kamis", "28-Feb-2036", 30], ["Safar", "Sabtu", "29-Mar-2036", 29], ["Rabiulawal", "Ahad", "27-Apr-2036", 30], ["Rabiulakhir", "Selasa", "27-May-2036", 29], ["Jumadilawal", "Rabu", "25-Jun-2036", 29], ["Jumadilakhir", "Kamis", "24-Jul-2036", 30], ["Rajab", "Sabtu", "23-Aug-2036", 29], ["Syakban", "Ahad", "21-Sep-2036", 29], ["Ramadan", "Senin", "20-Oct-2036", 30], ["Syawal", "Rabu", "19-Nov-2036", 30], ["Zulkaidah", "Jumat", "19-Dec-2036", 30], ["Zulhijah", "Ahad", "18-Jan-2037", 29]],
1459: [["Muharam", "Senin", "16-Feb-2037", 30], ["Safar", "Rabu", "18-Mar-2037", 30], ["Rabiulawal", "Jumat", "17-Apr-2037", 29], ["Rabiulakhir", "Sabtu", "16-May-2037", 29], ["Jumadilawal", "Ahad", "14-Jun-2037", 30], ["Jumadilakhir", "Selasa", "14-Jul-2037", 29], ["Rajab", "Rabu", "12-Aug-2037", 30], ["Syakban", "Jumat", "11-Sep-2037", 29], ["Ramadan", "Sabtu", "10-Oct-2037", 30], ["Syawal", "Ahad", "08-Nov-2037", 30], ["Zulkaidah", "Selasa", "08-Dec-2037", 30], ["Zulhijah", "Kamis", "07-Jan-2038", 29]],
1460: [["Muharam", "Jumat", "05-Feb-2038", 30], ["Safar", "Ahad", "07-Mar-2038", 30], ["Rabiulawal", "Senin", "05-Apr-2038", 29], ["Rabiulakhir", "Rabu", "05-May-2038", 30], ["Jumadilawal", "Jumat", "04-Jun-2038", 29], ["Jumadilakhir", "Sabtu", "03-Jul-2038", 30], ["Rajab", "Senin", "02-Aug-2038", 29], ["Syakban", "Selasa", "31-Aug-2038", 30], ["Ramadan", "Kamis", "30-Sep-2038", 29], ["Syawal", "Jumat", "29-Oct-2038", 29], ["Zulkaidah", "Sabtu", "27-Nov-2038", 30], ["Zulhijah", "Senin", "27-Dec-2038", 30]],
1461: [["Muharam", "Rabu", "26-Jan-2039", 29], ["Safar", "Kamis", "24-Feb-2039", 30], ["Rabiulawal", "Sabtu", "26-Mar-2039", 29], ["Rabiulakhir", "Ahad", "24-Apr-2039", 30], ["Jumadilawal", "Selasa", "24-May-2039", 29], ["Jumadilakhir", "Rabu", "22-Jun-2039", 30], ["Rajab", "Jumat", "22-Jul-2039", 30], ["Syakban", "Ahad", "21-Aug-2039", 29], ["Ramadan", "Senin", "19-Sep-2039", 30], ["Syawal", "Rabu", "19-Oct-2039", 29], ["Zulkaidah", "Kamis", "17-Nov-2039", 30], ["Zulhijah", "Sabtu", "17-Dec-2039", 29]],
1462: [["Muharam", "Ahad", "15-Jan-2040", 29], ["Safar", "Senin", "13-Feb-2040", 30], ["Rabiulawal", "Rabu", "14-Mar-2040", 29], ["Rabiulakhir", "Kamis", "12-Apr-2040", 30], ["Jumadilawal", "Sabtu", "12-May-2040", 29], ["Jumadilakhir", "Ahad", "10-Jun-2040", 30], ["Rajab", "Selasa", "10-Jul-2040", 30], ["Syakban", "Kamis", "09-Aug-2040", 30], ["Ramadan", "Jumat", "08-Sep-2040", 30], ["Syawal", "Ahad", "07-Oct-2040", 30], ["Zulkaidah", "Selasa", "06-Nov-2040", 29], ["Zulhijah", "Rabu", "05-Dec-2040", 30]],
1463: [["Muharam", "Jumat", "04-Jan-2041", 29], ["Safar", "Sabtu", "02-Feb-2041", 29], ["Rabiulawal", "Ahad", "03-Mar-2041", 30], ["Rabiulakhir", "Selasa", "02-Apr-2041", 29], ["Jumadilawal", "Rabu", "01-May-2041", 30], ["Jumadilakhir", "Jumat", "31-May-2041", 29], ["Rajab", "Sabtu", "29-Jun-2041", 30], ["Syakban", "Senin", "29-Jul-2041", 29], ["Ramadan", "Selasa", "27-Aug-2041", 30], ["Syawal", "Kamis", "26-Sep-2041", 30], ["Zulkaidah", "Sabtu", "26-Oct-2041", 30], ["Zulhijah", "Senin", "25-Nov-2041", 29]],
1464: [["Muharam", "Selasa", "24-Dec-2041", 30], ["Safar", "Kamis", "23-Jan-2042", 29], ["Rabiulawal", "Jumat", "21-Feb-2042", 30], ["Rabiulakhir", "Ahad", "23-Mar-2042", 29], ["Jumadilawal", "Senin", "21-Apr-2042", 29], ["Jumadilakhir", "Selasa", "20-May-2042", 30], ["Rajab", "Kamis", "19-Jun-2042", 29], ["Syakban", "Jumat", "18-Jul-2042", 30], ["Ramadan", "Ahad", "17-Aug-2042", 29], ["Syawal", "Senin", "16-Sep-2042", 30], ["Zulkaidah", "Rabu", "15-Oct-2042", 30], ["Zulhijah", "Jumat", "14-Nov-2042", 30]],
1465: [["Muharam", "Ahad", "14-Dec-2042", 29], ["Safar", "Senin", "12-Jan-2043", 30], ["Rabiulawal", "Rabu", "11-Feb-2043", 29], ["Rabiulakhir", "Kamis", "12-Mar-2043", 30], ["Jumadilawal", "Sabtu", "11-Apr-2043", 29], ["Jumadilakhir", "Ahad", "10-May-2043", 30], ["Rajab", "Senin", "08-Jun-2043", 29], ["Syakban", "Selasa", "07-Jul-2043", 30], ["Ramadan", "Kamis", "06-Aug-2043", 29], ["Syawal", "Jumat", "04-Sep-2043", 30], ["Zulkaidah", "Ahad", "04-Oct-2043", 30], ["Zulhijah", "Selasa", "03-Nov-2043", 30]],
1466: [["Muharam", "Kamis", "03-Dec-2043", 29], ["Safar", "Jumat", "01-Jan-2044", 30], ["Rabiulawal", "Ahad", "31-Jan-2044", 30], ["Rabiulakhir", "Selasa", "01-Mar-2044", 29], ["Jumadilawal", "Rabu", "30-Mar-2044", 30], ["Jumadilakhir", "Jumat", "29-Apr-2044", 29], ["Rajab", "Sabtu", "28-May-2044", 29], ["Syakban", "Ahad", "26-Jun-2044", 29], ["Ramadan", "Senin", "25-Jul-2044", 30], ["Syawal", "Rabu", "24-Aug-2044", 29], ["Zulkaidah", "Kamis", "22-Sep-2044", 30], ["Zulhijah", "Sabtu", "22-Oct-2044", 30]],
1467: [["Muharam", "Senin", "21-Nov-2044", 29], ["Safar", "Selasa", "20-Dec-2044", 30], ["Rabiulawal", "Kamis", "19-Jan-2045", 30], ["Rabiulakhir", "Sabtu", "18-Feb-2045", 30], ["Jumadilawal", "Senin", "20-Mar-2045", 29], ["Jumadilakhir", "Selasa", "18-Apr-2045", 30], ["Rajab", "Kamis", "18-May-2045", 29], ["Syakban", "Jumat", "16-Jun-2045", 29], ["Ramadan", "Sabtu", "15-Jul-2045", 29], ["Syawal", "Ahad", "13-Aug-2045", 30], ["Zulkaidah", "Selasa", "12-Sep-2045", 29], ["Zulhijah", "Rabu", "11-Oct-2045", 30]],
1468: [["Muharam", "Jumat", "10-Nov-2045", 30], ["Safar", "Ahad", "10-Dec-2045", 29], ["Rabiulawal", "Senin", "08-Jan-2046", 30], ["Rabiulakhir", "Rabu", "07-Feb-2046", 30], ["Jumadilawal", "Jumat", "09-Mar-2046", 29], ["Jumadilakhir", "Sabtu", "07-Apr-2046", 30], ["Rajab", "Senin", "07-May-2046", 29], ["Syakban", "Selasa", "05-Jun-2046", 30], ["Ramadan", "Kamis", "05-Jul-2046", 29], ["Syawal", "Jumat", "03-Aug-2046", 30], ["Zulkaidah", "Ahad", "02-Sep-2046", 29], ["Zulhijah", "Senin", "01-Oct-2046", 29]],
1469: [["Muharam", "Selasa", "30-Oct-2046", 30], ["Safar", "Kamis", "29-Nov-2046", 29], ["Rabiulawal", "Sabtu", "29-Dec-2046", 30], ["Rabiulakhir", "Ahad", "27-Jan-2047", 29], ["Jumadilawal", "Selasa", "26-Feb-2047", 30], ["Jumadilakhir", "Kamis", "28-Mar-2047", 29], ["Rajab", "Jumat", "26-Apr-2047", 30], ["Syakban", "Ahad", "26-May-2047", 29], ["Ramadan", "Selasa", "25-Jun-2047", 30], ["Syawal", "Rabu", "24-Jul-2047", 29], ["Zulkaidah", "Kamis", "22-Aug-2047", 30], ["Zulhijah", "Sabtu", "21-Sep-2047", 29]],
1470: [["Muharam", "Ahad", "20-Oct-2047", 30], ["Safar", "Selasa", "19-Nov-2047", 29], ["Rabiulawal", "Rabu", "18-Dec-2047", 29], ["Rabiulakhir", "Kamis", "16-Jan-2048", 30], ["Jumadilawal", "Sabtu", "15-Feb-2048", 29], ["Jumadilakhir", "Ahad", "15-Mar-2048", 30], ["Rajab", "Selasa", "14-Apr-2048", 30], ["Syakban", "Kamis", "14-May-2048", 30], ["Ramadan", "Sabtu", "13-Jun-2048", 29], ["Syawal", "Ahad", "12-Jul-2048", 30], ["Zulkaidah", "Selasa", "11-Aug-2048", 29], ["Zulhijah", "Rabu", "09-Sep-2048", 30]],
1471: [["Muharam", "Jumat", "09-Oct-2048", 29], ["Safar", "Sabtu", "07-Nov-2048", 30], ["Rabiulawal", "Senin", "07-Dec-2048", 29], ["Rabiulakhir", "Selasa", "05-Jan-2049", 29], ["Jumadilawal", "Rabu", "03-Feb-2049", 30], ["Jumadilakhir", "Jumat", "05-Mar-2049", 29], ["Rajab", "Sabtu", "03-Apr-2049", 30], ["Syakban", "Senin", "03-May-2049", 30], ["Ramadan", "Rabu", "02-Jun-2049", 29], ["Syawal", "Kamis", "01-Jul-2049", 30], ["Zulkaidah", "Sabtu", "31-Jul-2049", 30], ["Zulhijah", "Senin", "30-Aug-2049", 29]],
1472: [["Muharam", "Selasa", "28-Sep-2049", 30], ["Safar", "Kamis", "28-Oct-2049", 29], ["Rabiulawal", "Jumat", "26-Nov-2049", 30], ["Rabiulakhir", "Ahad", "26-Dec-2049", 29], ["Jumadilawal", "Senin", "24-Jan-2050", 29], ["Jumadilakhir", "Selasa", "22-Feb-2050", 30], ["Rajab", "Kamis", "24-Mar-2050", 29], ["Syakban", "Jumat", "22-Apr-2050", 30], ["Ramadan", "Ahad", "22-May-2050", 29], ["Syawal", "Senin", "20-Jun-2050", 30], ["Zulkaidah", "Rabu", "20-Jul-2050", 30], ["Zulhijah", "Jumat", "19-Aug-2050", 29]],
1473: [["Muharam", "Sabtu", "17-Sep-2050", 30], ["Safar", "Senin", "17-Oct-2050", 30], ["Rabiulawal", "Rabu", "16-Nov-2050", 29], ["Rabiulakhir", "Kamis", "15-Dec-2050", 30], ["Jumadilawal", "Sabtu", "14-Jan-2051", 29], ["Jumadilakhir", "Ahad", "12-Feb-2051", 30], ["Rajab", "Selasa", "14-Mar-2051", 29], ["Syakban", "Rabu", "12-Apr-2051", 29], ["Ramadan", "Kamis", "11-May-2051", 30], ["Syawal", "Sabtu", "10-Jun-2051", 29], ["Zulkaidah", "Ahad", "09-Jul-2051", 30], ["Zulhijah", "Selasa", "08-Aug-2051", 29]],
1474: [["Muharam", "Rabu", "06-Sep-2051", 30], ["Safar", "Jumat", "06-Oct-2051", 30], ["Rabiulawal", "Ahad", "05-Nov-2051", 29], ["Rabiulakhir", "Senin", "04-Dec-2051", 30], ["Jumadilawal", "Rabu", "03-Jan-2052", 30], ["Jumadilakhir", "Jumat", "02-Feb-2052", 29], ["Rajab", "Sabtu", "02-Mar-2052", 30], ["Syakban", "Senin", "01-Apr-2052", 29], ["Ramadan", "Selasa", "30-Apr-2052", 29], ["Syawal", "Rabu", "29-May-2052", 30], ["Zulkaidah", "Jumat", "28-Jun-2052", 29], ["Zulhijah", "Sabtu", "27-Jul-2052", 30]],
1475: [["Muharam", "Senin", "26-Aug-2052", 29], ["Safar", "Selasa", "24-Sep-2052", 30], ["Rabiulawal", "Kamis", "24-Oct-2052", 29], ["Rabiulakhir", "Jumat", "22-Nov-2052", 30], ["Jumadilawal", "Ahad", "22-Dec-2052", 30], ["Jumadilakhir", "Selasa", "21-Jan-2053", 29], ["Rajab", "Kamis", "20-Feb-2053", 29], ["Syakban", "Jumat", "21-Mar-2053", 30], ["Ramadan", "Ahad", "20-Apr-2053", 29], ["Syawal", "Senin", "19-May-2053", 29], ["Zulkaidah", "Selasa", "17-Jun-2053", 30], ["Zulhijah", "Kamis", "17-Jul-2053", 29]],
1476: [["Muharam", "Jumat", "15-Aug-2053", 29], ["Safar", "Sabtu", "13-Sep-2053", 30], ["Rabiulawal", "Senin", "13-Oct-2053", 29], ["Rabiulakhir", "Selasa", "11-Nov-2053", 30], ["Jumadilawal", "Kamis", "11-Dec-2053", 30], ["Jumadilakhir", "Sabtu", "10-Jan-2054", 30], ["Rajab", "Senin", "09-Feb-2054", 29], ["Syakban", "Rabu", "11-Mar-2054", 29], ["Ramadan", "Kamis", "09-Apr-2054", 30], ["Syawal", "Sabtu", "09-May-2054", 29], ["Zulkaidah", "Ahad", "07-Jun-2054", 29], ["Zulhijah", "Senin", "06-Jul-2054", 30]],
1477: [["Muharam", "Rabu", "05-Aug-2054", 29], ["Safar", "Kamis", "03-Sep-2054", 29], ["Rabiulawal", "Jumat", "02-Oct-2054", 30], ["Rabiulakhir", "Ahad", "01-Nov-2054", 29], ["Jumadilawal", "Senin", "30-Nov-2054", 30], ["Jumadilakhir", "Rabu", "30-Dec-2054", 30], ["Rajab", "Jumat", "29-Jan-2055", 30], ["Syakban", "Ahad", "28-Feb-2055", 29], ["Ramadan", "Senin", "29-Mar-2055", 30], ["Syawal", "Rabu", "28-Apr-2055", 30], ["Zulkaidah", "Jumat", "28-May-2055", 29], ["Zulhijah", "Sabtu", "26-Jun-2055", 29]],
1478: [["Muharam", "Ahad", "25-Jul-2055", 30], ["Safar", "Selasa", "24-Aug-2055", 29], ["Rabiulawal", "Rabu", "22-Sep-2055", 29], ["Rabiulakhir", "Kamis", "21-Oct-2055", 30], ["Jumadilawal", "Sabtu", "20-Nov-2055", 29], ["Jumadilakhir", "Ahad", "19-Dec-2055", 30], ["Rajab", "Selasa", "18-Jan-2056", 30], ["Syakban", "Kamis", "17-Feb-2056", 29], ["Ramadan", "Jumat", "17-Mar-2056", 30], ["Syawal", "Ahad", "16-Apr-2056", 30], ["Zulkaidah", "Selasa", "16-May-2056", 29], ["Zulhijah", "Rabu", "14-Jun-2056", 30]],
1479: [["Muharam", "Jumat", "14-Jul-2056", 29], ["Safar", "Sabtu", "12-Aug-2056", 30], ["Rabiulawal", "Senin", "11-Sep-2056", 29], ["Rabiulakhir", "Selasa", "10-Oct-2056", 30], ["Jumadilawal", "Rabu", "08-Nov-2056", 30], ["Jumadilakhir", "Jumat", "08-Dec-2056", 29], ["Rajab", "Sabtu", "06-Jan-2057", 30], ["Syakban", "Senin", "05-Feb-2057", 29], ["Ramadan", "Selasa", "06-Mar-2057", 30], ["Syawal", "Kamis", "05-Apr-2057", 30], ["Zulkaidah", "Sabtu", "05-May-2057", 29], ["Zulhijah", "Ahad", "03-Jun-2057", 30]],
1480: [["Muharam", "Selasa", "03-Jul-2057", 30], ["Safar", "Kamis", "02-Aug-2057", 29], ["Rabiulawal", "Jumat", "31-Aug-2057", 30], ["Rabiulakhir", "Sabtu", "29-Sep-2057", 30], ["Jumadilawal", "Senin", "29-Oct-2057", 30], ["Jumadilakhir", "Rabu", "28-Nov-2057", 29], ["Rajab", "Kamis", "27-Dec-2057", 29], ["Syakban", "Jumat", "25-Jan-2058", 30], ["Ramadan", "Ahad", "24-Feb-2058", 29], ["Syawal", "Senin", "25-Mar-2058", 30], ["Zulkaidah", "Rabu", "24-Apr-2058", 29], ["Zulhijah", "Kamis", "23-May-2058", 30]],
1481: [["Muharam", "Sabtu", "22-Jun-2058", 29], ["Safar", "Ahad", "21-Jul-2058", 30], ["Rabiulawal", "Selasa", "20-Aug-2058", 30], ["Rabiulakhir", "Kamis", "19-Sep-2058", 30], ["Jumadilawal", "Sabtu", "19-Oct-2058", 29], ["Jumadilakhir", "Ahad", "17-Nov-2058", 30], ["Rajab", "Selasa", "17-Dec-2058", 29], ["Syakban", "Rabu", "15-Jan-2059", 29], ["Ramadan", "Kamis", "13-Feb-2059", 30], ["Syawal", "Sabtu", "15-Mar-2059", 29], ["Zulkaidah", "Ahad", "13-Apr-2059", 30], ["Zulhijah", "Selasa", "13-May-2059", 29]],
1482: [["Muharam", "Rabu", "11-Jun-2059", 30], ["Safar", "Jumat", "11-Jul-2059", 29], ["Rabiulawal", "Sabtu", "09-Aug-2059", 30], ["Rabiulakhir", "Senin", "08-Sep-2059", 30], ["Jumadilawal", "Rabu", "08-Oct-2059", 30], ["Jumadilakhir", "Jumat", "07-Nov-2059", 29], ["Rajab", "Sabtu", "06-Dec-2059", 30], ["Syakban", "Senin", "05-Jan-2060", 29], ["Ramadan", "Selasa", "03-Feb-2060", 30], ["Syawal", "Kamis", "04-Mar-2060", 29], ["Zulkaidah", "Jumat", "02-Apr-2060", 29], ["Zulhijah", "Sabtu", "01-May-2060", 30]],
1483: [["Muharam", "Senin", "31-May-2060", 29], ["Safar", "Selasa", "29-Jun-2060", 29], ["Rabiulawal", "Rabu", "28-Jul-2060", 30], ["Rabiulakhir", "Jumat", "27-Aug-2060", 30], ["Jumadilawal", "Ahad", "26-Sep-2060", 30], ["Jumadilakhir", "Selasa", "26-Oct-2060", 29], ["Rajab", "Rabu", "24-Nov-2060", 30], ["Syakban", "Jumat", "24-Dec-2060", 30], ["Ramadan", "Ahad", "23-Jan-2061", 29], ["Syawal", "Senin", "21-Feb-2061", 30], ["Zulkaidah", "Rabu", "23-Mar-2061", 29], ["Zulhijah", "Kamis", "21-Apr-2061", 29]],
1484: [["Muharam", "Jumat", "20-May-2061", 29], ["Safar", "Sabtu", "18-Jun-2061", 30], ["Rabiulawal", "Senin", "18-Jul-2061", 29], ["Rabiulakhir", "Selasa", "16-Aug-2061", 30], ["Jumadilawal", "Kamis", "15-Sep-2061", 30], ["Jumadilakhir", "Sabtu", "15-Oct-2061", 29], ["Rajab", "Ahad", "13-Nov-2061", 30], ["Syakban", "Selasa", "13-Dec-2061", 30], ["Ramadan", "Kamis", "12-Jan-2062", 30], ["Syawal", "Sabtu", "11-Feb-2062", 29], ["Zulkaidah", "Ahad", "12-Mar-2062", 30], ["Zulhijah", "Selasa", "11-Apr-2062", 29]],
1485: [["Muharam", "Rabu", "10-May-2062", 29], ["Safar", "Kamis", "08-Jun-2062", 29], ["Rabiulawal", "Jumat", "07-Jul-2062", 30], ["Rabiulakhir", "Ahad", "06-Aug-2062", 29], ["Jumadilawal", "Senin", "04-Sep-2062", 30], ["Jumadilakhir", "Rabu", "04-Oct-2062", 29], ["Rajab", "Kamis", "02-Nov-2062", 30], ["Syakban", "Sabtu", "02-Dec-2062", 30], ["Ramadan", "Senin", "01-Jan-2063", 30], ["Syawal", "Rabu", "31-Jan-2063", 29], ["Zulkaidah", "Kamis", "01-Mar-2063", 30], ["Zulhijah", "Sabtu", "31-Mar-2063", 29]],
1486: [["Muharam", "Ahad", "29-Apr-2063", 30], ["Safar", "Selasa", "29-May-2063", 29], ["Rabiulawal", "Rabu", "27-Jun-2063", 30], ["Rabiulakhir", "Jumat", "27-Jul-2063", 29], ["Jumadilawal", "Sabtu", "25-Aug-2063", 29], ["Jumadilakhir", "Ahad", "23-Sep-2063", 30], ["Rajab", "Selasa", "23-Oct-2063", 29], ["Syakban", "Rabu", "21-Nov-2063", 30], ["Ramadan", "Jumat", "21-Dec-2063", 30], ["Syawal", "Ahad", "20-Jan-2064", 29], ["Zulkaidah", "Senin", "18-Feb-2064", 30], ["Zulhijah", "Rabu", "19-Mar-2064", 30]],
1487: [["Muharam", "Jumat", "18-Apr-2064", 29], ["Safar", "Sabtu", "17-May-2064", 30], ["Rabiulawal", "Senin", "16-Jun-2064", 29], ["Rabiulakhir", "Selasa", "15-Jul-2064", 30], ["Jumadilawal", "Kamis", "14-Aug-2064", 29], ["Jumadilakhir", "Jumat", "12-Sep-2064", 29], ["Rajab", "Sabtu", "11-Oct-2064", 30], ["Syakban", "Senin", "10-Nov-2064", 29], ["Ramadan", "Selasa", "09-Dec-2064", 30], ["Syawal", "Kamis", "08-Jan-2065", 29], ["Zulkaidah", "Jumat", "06-Feb-2065", 30], ["Zulhijah", "Ahad", "08-Mar-2065", 30]],
1488: [["Muharam", "Selasa", "07-Apr-2065", 29], ["Safar", "Rabu", "06-May-2065", 30], ["Rabiulawal", "Jumat", "05-Jun-2065", 30], ["Rabiulakhir", "Ahad", "05-Jul-2065", 29], ["Jumadilawal", "Senin", "03-Aug-2065", 30], ["Jumadilakhir", "Rabu", "02-Sep-2065", 29], ["Rajab", "Kamis", "01-Oct-2065", 29], ["Syakban", "Jumat", "30-Oct-2065", 30], ["Ramadan", "Ahad", "29-Nov-2065", 29], ["Syawal", "Senin", "28-Dec-2065", 30], ["Zulkaidah", "Rabu", "27-Jan-2066", 29], ["Zulhijah", "Kamis", "25-Feb-2066", 30]],
1489: [["Muharam", "Sabtu", "27-Mar-2066", 29], ["Safar", "Ahad", "25-Apr-2066", 30], ["Rabiulawal", "Selasa", "25-May-2066", 30], ["Rabiulakhir", "Kamis", "24-Jun-2066", 30], ["Jumadilawal", "Sabtu", "24-Jul-2066", 29], ["Jumadilakhir", "Ahad", "22-Aug-2066", 30], ["Rajab", "Selasa", "21-Sep-2066", 29], ["Syakban", "Rabu", "20-Oct-2066", 30], ["Ramadan", "Jumat", "19-Nov-2066", 29], ["Syawal", "Sabtu", "18-Dec-2066", 29], ["Zulkaidah", "Ahad", "16-Jan-2067", 30], ["Zulhijah", "Selasa", "15-Feb-2067", 29]],
1490: [["Muharam", "Rabu", "16-Mar-2067", 30], ["Safar", "Jumat", "15-Apr-2067", 29], ["Rabiulawal", "Sabtu", "14-May-2067", 30], ["Rabiulakhir", "Senin", "13-Jun-2067", 30], ["Jumadilawal", "Rabu", "13-Jul-2067", 29], ["Jumadilakhir", "Kamis", "11-Aug-2067", 30], ["Rajab", "Sabtu", "10-Sep-2067", 30], ["Syakban", "Ahad", "10-Oct-2067", 29], ["Ramadan", "Selasa", "08-Nov-2067", 30], ["Syawal", "Kamis", "08-Dec-2067", 29], ["Zulkaidah", "Jumat", "06-Jan-2068", 29], ["Zulhijah", "Sabtu", "04-Feb-2068", 30]],
1491: [["Muharam", "Senin", "05-Mar-2068", 29], ["Safar", "Selasa", "03-Apr-2068", 30], ["Rabiulawal", "Kamis", "03-May-2068", 29], ["Rabiulakhir", "Jumat", "01-Jun-2068", 30], ["Jumadilawal", "Ahad", "01-Jul-2068", 29], ["Jumadilakhir", "Senin", "30-Jul-2068", 30], ["Rajab", "Rabu", "29-Aug-2068", 30], ["Syakban", "Jumat", "28-Sep-2068", 29], ["Ramadan", "Sabtu", "27-Oct-2068", 30], ["Syawal", "Senin", "26-Nov-2068", 30], ["Zulkaidah", "Rabu", "26-Dec-2068", 29], ["Zulhijah", "Kamis", "24-Jan-2069", 29]],
1492: [["Muharam", "Jumat", "22-Feb-2069", 30], ["Safar", "Ahad", "24-Mar-2069", 29], ["Rabiulawal", "Senin", "22-Apr-2069", 30], ["Rabiulakhir", "Rabu", "22-May-2069", 29], ["Jumadilawal", "Kamis", "20-Jun-2069", 29], ["Jumadilakhir", "Jumat", "19-Jul-2069", 30], ["Rajab", "Ahad", "18-Aug-2069", 30], ["Syakban", "Selasa", "17-Sep-2069", 29], ["Ramadan", "Rabu", "16-Oct-2069", 30], ["Syawal", "Jumat", "15-Nov-2069", 30], ["Zulkaidah", "Ahad", "15-Dec-2069", 29], ["Zulhijah", "Senin", "13-Jan-2070", 30]],
1493: [["Muharam", "Rabu", "12-Feb-2070", 29], ["Safar", "Jumat", "14-Mar-2070", 29], ["Rabiulawal", "Sabtu", "12-Apr-2070", 29], ["Rabiulakhir", "Ahad", "11-May-2070", 30], ["Jumadilawal", "Selasa", "10-Jun-2070", 29], ["Jumadilakhir", "Rabu", "09-Jul-2070", 29], ["Rajab", "Kamis", "07-Aug-2070", 30], ["Syakban", "Sabtu", "06-Sep-2070", 29], ["Ramadan", "Ahad", "05-Oct-2070", 30], ["Syawal", "Selasa", "04-Nov-2070", 30], ["Zulkaidah", "Kamis", "04-Dec-2070", 29], ["Zulhijah", "Jumat", "02-Jan-2071", 30]],
1494: [["Muharam", "Ahad", "01-Feb-2071", 30], ["Safar", "Selasa", "03-Mar-2071", 30], ["Rabiulawal", "Kamis", "02-Apr-2071", 29], ["Rabiulakhir", "Jumat", "01-May-2071", 29], ["Jumadilawal", "Sabtu", "30-May-2071", 30], ["Jumadilakhir", "Senin", "29-Jun-2071", 29], ["Rajab", "Selasa", "28-Jul-2071", 29], ["Syakban", "Rabu", "26-Aug-2071", 30], ["Ramadan", "Jumat", "25-Sep-2071", 29], ["Syawal", "Sabtu", "24-Oct-2071", 30], ["Zulkaidah", "Senin", "23-Nov-2071", 29], ["Zulhijah", "Selasa", "22-Dec-2071", 30]],
1495: [["Muharam", "Kamis", "21-Jan-2072", 30], ["Safar", "Sabtu", "20-Feb-2072", 30], ["Rabiulawal", "Senin", "21-Mar-2072", 29], ["Rabiulakhir", "Selasa", "19-Apr-2072", 30], ["Jumadilawal", "Kamis", "19-May-2072", 29], ["Jumadilakhir", "Jumat", "17-Jun-2072", 30], ["Rajab", "Ahad", "17-Jul-2072", 29], ["Syakban", "Senin", "15-Aug-2072", 29], ["Ramadan", "Selasa", "13-Sep-2072", 30], ["Syawal", "Kamis", "13-Oct-2072", 29], ["Zulkaidah", "Jumat", "11-Nov-2072", 30], ["Zulhijah", "Ahad", "11-Dec-2072", 29]],
1496: [["Muharam", "Senin", "09-Jan-2073", 30], ["Safar", "Rabu", "08-Feb-2073", 30], ["Rabiulawal", "Jumat", "10-Mar-2073", 30], ["Rabiulakhir", "Ahad", "09-Apr-2073", 29], ["Jumadilawal", "Senin", "08-May-2073", 30], ["Jumadilakhir", "Rabu", "07-Jun-2073", 29], ["Rajab", "Kamis", "06-Jul-2073", 30], ["Syakban", "Sabtu", "05-Aug-2073", 29], ["Ramadan", "Ahad", "03-Sep-2073", 29], ["Syawal", "Senin", "02-Oct-2073", 30], ["Zulkaidah", "Rabu", "01-Nov-2073", 29], ["Zulhijah", "Kamis", "30-Nov-2073", 30]],
1497: [["Muharam", "Sabtu", "30-Dec-2073", 29], ["Safar", "Ahad", "28-Jan-2074", 30], ["Rabiulawal", "Selasa", "27-Feb-2074", 30], ["Rabiulakhir", "Kamis", "29-Mar-2074", 29], ["Jumadilawal", "Jumat", "27-Apr-2074", 30], ["Jumadilakhir", "Ahad", "27-May-2074", 30], ["Rajab", "Selasa", "26-Jun-2074", 29], ["Syakban", "Rabu", "25-Jul-2074", 30], ["Ramadan", "Jumat", "24-Aug-2074", 29], ["Syawal", "Sabtu", "22-Sep-2074", 29], ["Zulkaidah", "Ahad", "21-Oct-2074", 30], ["Zulhijah", "Selasa", "20-Nov-2074", 30]],
1498: [
[
"Muharam",
"Selasa",
"19-Dec-2074",
30
],
[
"Safar",
"Kamis",
"18-Jan-2075",
29
],
[
"Rabiulawal",
"Jumat",
"16-Feb-2075",
30
],
[
"Rabiulakhir",
"Ahad",
"18-Mar-2075",
29
],
[
"Jumadilawal",
"Senin",
"16-Apr-2075",
30
],
[
"Jumadilakhir",
"Rabu",
"16-May-2075",
29
],
[
"Rajab",
"Kamis",
"14-Jun-2075",
30
],
[
"Syakban",
"Sabtu",
"14-Jul-2075",
30
],
[
"Ramadan",
"Senin",
"13-Aug-2075",
29
],
[
"Syawal",
"Selasa",
"11-Sep-2075",
30
],
[
"Zulkaidah",
"Kamis",
"11-Oct-2075",
29
],
[
"Zulhijah",
"Jumat",
"09-Nov-2075",
30
]
],
"1499": [
[
"Muharam",
"Ahad",
"09-Dec-2075",
29
],
[
"Safar",
"Senin",
"07-Jan-2076",
30
],
[
"Rabiulawal",
"Rabu",
"06-Feb-2076",
29
],
[
"Rabiulakhir",
"Kamis",
"06-Mar-2076",
30
],
[
"Jumadilawal",
"Sabtu",
"05-Apr-2076",
29
],
[
"Jumadilakhir",
"Ahad",
"04-May-2076",
30
],
[
"Rajab",
"Selasa",
"03-Jun-2076",
29
],
[
"Syakban",
"Rabu",
"02-Jul-2076",
30
],
[
"Ramadan",
"Jumat",
"01-Aug-2076",
29
],
[
"Syawal",
"Sabtu",
"30-Aug-2076",
30
],
[
"Zulkaidah",
"Senin",
"29-Sep-2076",
30
],
[
"Zulhijah",
"Rabu",
"29-Oct-2076",
29
]
],
"1500": [
[
"Muharam",
"Kamis",
"27-Nov-2076",
30
],
[
"Safar",
"Sabtu",
"27-Dec-2076",
29
],
[
"Rabiulawal",
"Ahad",
"25-Jan-2077",
30
],
[
"Rabiulakhir",
"Selasa",
"24-Feb-2077",
29
],
[
"Jumadilawal",
"Rabu",
"25-Mar-2077",
30
],
[
"Jumadilakhir",
"Jumat",
"24-Apr-2077",
29
],
[
"Rajab",
"Sabtu",
"23-May-2077",
29
],
[
"Syakban",
"Ahad",
"21-Jun-2077",
30
],
[
"Ramadan",
"Selasa",
"21-Jul-2077",
29
],
[
"Syawal",
"Rabu",
"19-Aug-2077",
30
],
[
"Zulkaidah",
"Jumat",
"18-Sep-2077",
30
],
[
"Zulhijah",
"Ahad",
"18-Oct-2077",
30
]
]
}
class Menu20App(ctk.CTk):
def __init__(self):
super().__init__()
self.title("Komparasi 50 Tahun Ramadhan (Modul 20)")
self.geometry("1000x600")
ctk.set_appearance_mode("Dark")
self.setup_ui()
def get_header(self, width):
return "\n".join(line.center(width) for line in ["By the Name of Allah", "KALENDER HIJRIAH GLOBAL TUNGGAL", "KHGT Times 7.2"])
def setup_ui(self):
self.sidebar = ctk.CTkFrame(self, width=250)
self.sidebar.pack(side="left", fill="y", padx=10, pady=10)
ctk.CTkLabel(self.sidebar, text="KOMPARASI 50 TAHUN\n(RAMADHAN)", font=("Segoe UI", 16, "bold"), text_color="#00E5FF").pack(pady=20)
ctk.CTkLabel(self.sidebar, text="Rentang: 1447 H - 1496 H", text_color="yellow").pack(pady=5)
self.btn_hitung = ctk.CTkButton(self.sidebar, text="▶ MULAI ANALISIS", command=self.analisis_komparasi_ramadhan_50_tahun, height=40)
self.btn_hitung.pack(pady=20, fill="x", padx=20)
self.lbl_status = ctk.CTkLabel(self.sidebar, text="Sistem Siap", text_color="#00E676")
self.lbl_status.pack()
self.textbox = ctk.CTkTextbox(self, font=("Consolas", 13), wrap="none")
self.textbox.pack(side="right", fill="both", expand=True, padx=10, pady=10)
self.textbox.insert("1.0", "Klik 'MULAI ANALISIS' untuk membandingkan kriteria KHGT vs MABIMS Sabang.\nPastikan HIJRI_DB sudah lengkap di dalam kode.")
self.textbox.configure(state="disabled")
def analisis_komparasi_ramadhan_50_tahun(self):
threading.Thread(target=self._proses_komparasi_ramadhan, daemon=True).start()
def _proses_komparasi_ramadhan(self):
self.after(0, lambda: self.lbl_status.configure(text="Menganalisis...", text_color="#FFAB40"))
self.after(0, lambda: self.btn_hitung.configure(state="disabled"))
self.after(0, lambda: self.textbox.configure(state="normal"))
self.after(0, lambda: self.textbox.delete("1.0", "end"))
output_lines = []
output_lines.append(self.get_header(125))
output_lines.append("[ REKAPITULASI KOMPARASI AWAL RAMADHAN (1447 H - 1496 H) ]".center(125))
output_lines.append("KHGT (Global Alt>=5°, Eln>=8°) vs Neo MABIMS (Lokal Sabang Alt>=3°, Eln>=6.4°)".center(125))
output_lines.append("=" * 125)
output_lines.append(f"{'Tahun':<8} | {'Waktu Ijtimak (UTC)':<19} | {'1 Ramadhan (KHGT)':<20} | {'1 Ramadhan (MABIMS Sabang)':<28} | {'Status / Selisih'}")
output_lines.append("-" * 125)
sabang = ephem.Observer()
sabang.lat, sabang.lon = math.radians(5.8942), math.radians(95.3184)
sabang.elevation, sabang.pressure, sabang.temp = 0, 1010, 25
matahari, bulan = ephem.Sun(), ephem.Moon()
# Proses 1447 - 1496
for thn_h in range(1447, 1497):
try:
if thn_h not in HIJRI_DB:
output_lines.append(f"{thn_h} H | Database HIJRI_DB untuk tahun ini kosong/belum disalin.")
continue
# Index 8 adalah bulan ke-9 (Ramadan)
data_ramadan = HIJRI_DB[thn_h][8]
tgl_khgt_str = data_ramadan[2]
bulan_map = {"Jan":1, "Feb":2, "Mar":3, "Apr":4, "May":5, "Jun":6, "Jul":7, "Aug":8, "Sep":9, "Oct":10, "Nov":11, "Dec":12}
parts = tgl_khgt_str.split('-')
dt_khgt = datetime.datetime(int(parts[2]), bulan_map.get(parts[1], 1), int(parts[0]))
# Tanggal Rukyat (29 Syakban)
dt_rukyat = dt_khgt - datetime.timedelta(days=1)
# Waktu Ijtimak
ijtimak = ephem.previous_new_moon(ephem.Date(dt_rukyat) + 5)
str_ijtimak = ijtimak.datetime().strftime("%d-%m-%Y %H:%M")
# Kalkulasi Sunset Sabang
sabang.date = ephem.Date(dt_rukyat.replace(hour=0, minute=0, second=0))
try: waktu_sunset = sabang.next_setting(matahari)
except: waktu_sunset = ephem.Date(dt_rukyat.replace(hour=11, minute=30, second=0))
sabang.date = waktu_sunset
matahari.compute(sabang)
bulan.compute(sabang)
alt_topo = math.degrees(bulan.alt)
elong_topo = math.degrees(ephem.separation(matahari, bulan))
umur_bulan = waktu_sunset - ijtimak
if umur_bulan > 0 and alt_topo >= 3.0 and elong_topo >= 6.4:
dt_mabims = dt_khgt
status = "Serentak (Sama)"
else:
dt_mabims = dt_khgt + datetime.timedelta(days=1)
status = "Beda (MABIMS Mundur 1 Hari)"
str_khgt = dt_khgt.strftime("%d %b %Y")
str_mabims = dt_mabims.strftime("%d %b %Y")
output_lines.append(f"{thn_h} H | {str_ijtimak:<19} | {str_khgt:<20} | {str_mabims:<28} | {status}")
if (thn_h - 1446) % 10 == 0 and thn_h != 1496: output_lines.append("-" * 125)
except Exception as e:
output_lines.append(f"{thn_h} H | Error: {str(e)}")
output_lines.append("=" * 125)
self.after(0, lambda: self.textbox.insert("1.0", "\n".join(output_lines)))
self.after(0, lambda: self.textbox.configure(state="disabled"))
self.after(0, lambda: self.lbl_status.configure(text="Selesai", text_color="#00E676"))
self.after(0, lambda: self.btn_hitung.configure(state="normal"))
if __name__ == "__main__":
app = Menu20App()
app.mainloop()