# -*- coding: utf-8 -*-
"""
五柱十字干支万年历 v1.0
基于 lunar-python 库精确计算
支持农历、干支、节气、五柱(年月日时刻)
"""

import tkinter as tk
from tkinter import ttk, messagebox, scrolledtext
from datetime import datetime, timedelta
import pytz
from itertools import cycle, repeat

try:
    from lunar_python import Lunar, Solar, EightChar
    LUNAR_AVAILABLE = True
except ImportError:
    try:
        # 尝试另一个可能的包名
        from lunar import Lunar, Solar
        LUNAR_AVAILABLE = True
    except ImportError:
        LUNAR_AVAILABLE = False

# ==================== 常量 ====================
tian_gan = '甲乙丙丁戊己庚辛壬癸'
di_zhi = '子丑寅卯辰巳午未申酉戌亥'
jieqi_names = ['小寒', '大寒', '立春', '雨水', '惊蛰', '春分', '清明', '谷雨',
               '立夏', '小满', '芒种', '夏至', '小暑', '大暑', '立秋', '处暑',
               '白露', '秋分', '寒露', '霜降', '立冬', '小雪', '大雪', '冬至']

# 节气对应月支
jieqi_to_dizhi = {
    '立春': '寅', '雨水': '寅', '惊蛰': '卯', '春分': '卯', '清明': '辰', '谷雨': '辰',
    '立夏': '巳', '小满': '巳', '芒种': '午', '夏至': '午', '小暑': '未', '大暑': '未',
    '立秋': '申', '处暑': '申', '白露': '酉', '秋分': '酉', '寒露': '戌', '霜降': '戌',
    '立冬': '亥', '小雪': '亥', '大雪': '子', '冬至': '子', '小寒': '丑', '大寒': '丑'
}

# 五虎遁年起月
fivetigers = {
    tuple(list('甲己')): '丙寅', tuple(list('乙庚')): '戊寅', tuple(list('丙辛')): '庚寅',
    tuple(list('丁壬')): '壬寅', tuple(list('戊癸')): '甲寅'
}

# 五鼠遁日起时
fiverats = {
    tuple(list('甲己')): '甲子', tuple(list('乙庚')): '丙子', tuple(list('丙辛')): '戊子',
    tuple(list('丁壬')): '庚子', tuple(list('戊癸')): '壬子'
}

# 五马遁时起刻(刻柱用)
fivehourses = {
    tuple(list('丙辛')): '甲午', tuple(list('丁壬')): '丙午', tuple(list('戊癸')): '戊午',
    tuple(list('甲己')): '庚午', tuple(list('乙庚')): '壬午'
}

# 纳音五行
nayin_dict = {
    '甲子': '海中金', '乙丑': '海中金', '丙寅': '炉中火', '丁卯': '炉中火', '戊辰': '大林木', '己巳': '大林木',
    '庚午': '路旁土', '辛未': '路旁土', '壬申': '剑锋金', '癸酉': '剑锋金', '甲戌': '山头火', '乙亥': '山头火',
    '丙子': '涧下水', '丁丑': '涧下水', '戊寅': '城头土', '己卯': '城头土', '庚辰': '白蜡金', '辛巳': '白蜡金',
    '壬午': '杨柳木', '癸未': '杨柳木', '甲申': '泉中水', '乙酉': '泉中水', '丙戌': '屋上土', '丁亥': '屋上土',
    '戊子': '霹雳火', '己丑': '霹雳火', '庚寅': '松柏木', '辛卯': '松柏木', '壬辰': '长流水', '癸巳': '长流水',
    '甲午': '沙中金', '乙未': '沙中金', '丙申': '山下火', '丁酉': '山下火', '戊戌': '平地木', '己亥': '平地木',
    '庚子': '壁上土', '辛丑': '壁上土', '壬寅': '金箔金', '癸卯': '金箔金', '甲辰': '佛灯火', '乙巳': '佛灯火',
    '丙午': '天河水', '丁未': '天河水', '戊申': '大驿土', '己酉': '大驿土', '庚戌': '钗钏金', '辛亥': '钗钏金',
    '壬子': '桑柘木', '癸丑': '桑柘木', '甲寅': '大溪水', '乙卯': '大溪水', '丙辰': '沙中土', '丁巳': '沙中土',
    '戊午': '天上火', '己未': '天上火', '庚申': '石榴木', '辛酉': '石榴木', '壬戌': '大海水', '癸亥': '大海水'
}

lunar_month_names = ['', '正月', '二月', '三月', '四月', '五月', '六月', 
                     '七月', '八月', '九月', '十月', '冬月', '腊月']
lunar_day_names = [
    '初一', '初二', '初三', '初四', '初五', '初六', '初七', '初八', '初九', '初十',
    '十一', '十二', '十三', '十四', '十五', '十六', '十七', '十八', '十九', '二十',
    '廿一', '廿二', '廿三', '廿四', '廿五', '廿六', '廿七', '廿八', '廿九', '三十'
]


# ==================== 辅助函数 ====================

def jiazi():
    """生成六十甲子列表"""
    return [f"{tian_gan[i % 10]}{di_zhi[i % 12]}" for i in range(60)]


def multi_key_dict_get(d, k):
    """多键字典查找"""
    for keys, v in d.items():
        if k in keys:
            return v
    return None


def new_list(olist, o):
    """从指定元素开始循环列表"""
    a = olist.index(o)
    return olist[a:] + olist[:a]


def repeat_list(n, thelist):
    """重复列表每个元素n次"""
    return [item for item in thelist for _ in repeat(item, n)]


# ==================== 节气计算 ====================

def get_jieqi_info(year, month, day, hour=0, minute=0):
    """
    获取节气信息
    返回当前节气、上一节气、下一节气
    """
    if not LUNAR_AVAILABLE:
        return None
    
    try:
        solar = Solar.fromYmdHms(year, month, day, hour, minute, 0)
        lunar = solar.getLunar()
        
        # 获取当前节气的 Julian Day 信息
        jie_qi_table = lunar.getJieQiTable()
        
        # 获取当前最近的节气
        current_jieqi = lunar.getJieQi()
        if current_jieqi is None:
            current_jieqi = ""
        
        # 获取上一节气
        prev_jieqi = lunar.getPrevJieQi()
        prev_name = prev_jieqi.getName() if prev_jieqi else ""
        prev_solar = prev_jieqi.getSolar() if prev_jieqi else None
        
        # 获取下一节气
        next_jieqi = lunar.getNextJieQi()
        next_name = next_jieqi.getName() if next_jieqi else ""
        next_solar = next_jieqi.getSolar() if next_jieqi else None
        
        # 构建结果
        prev_info = None
        if prev_solar:
            prev_info = {
                "年": prev_solar.getYear(),
                "月": prev_solar.getMonth(),
                "日": prev_solar.getDay(),
                "时": prev_solar.getHour(),
                "分": prev_solar.getMinute(),
                "节气": prev_name,
                "时间": datetime(prev_solar.getYear(), prev_solar.getMonth(), 
                                prev_solar.getDay(), prev_solar.getHour(), 
                                prev_solar.getMinute())
            }
        
        next_info = None
        if next_solar:
            next_info = {
                "年": next_solar.getYear(),
                "月": next_solar.getMonth(),
                "日": next_solar.getDay(),
                "时": next_solar.getHour(),
                "分": next_solar.getMinute(),
                "节气": next_name,
                "时间": datetime(next_solar.getYear(), next_solar.getMonth(), 
                                next_solar.getDay(), next_solar.getHour(), 
                                next_solar.getMinute())
            }
        
        # 当前节气信息
        current_datetime = datetime(year, month, day, hour, minute)
        
        # 确定当前所在节气(根据上一节气)
        current_jq = prev_name if prev_info and prev_info["时间"] <= current_datetime else current_jieqi
        
        return {
            "current_name": current_jq,
            "prev": prev_info,
            "next": next_info
        }
        
    except Exception as e:
        print(f"节气计算错误: {e}")
        return None


def get_current_jieqi(year, month, day, hour=0, minute=0):
    """获取当前所在节气名称"""
    info = get_jieqi_info(year, month, day, hour, minute)
    if info and info["current_name"]:
        return info["current_name"]
    
    # 备用:简单月份映射
    month_map = {1: '小寒', 2: '立春', 3: '惊蛰', 4: '清明',
                 5: '立夏', 6: '芒种', 7: '小暑', 8: '立秋',
                 9: '白露', 10: '寒露', 11: '立冬', 12: '大雪'}
    return month_map.get(month, '冬至')


# ==================== 五柱核心计算 ====================

def find_lunar_month(year_gz):
    """根据年干支找月柱起点(五虎遁)"""
    result = multi_key_dict_get(fivetigers, year_gz[0])
    if result is None:
        result = multi_key_dict_get(fivetigers, year_gz[1])
    return dict(zip(range(1, 13), new_list(jiazi(), result)[:12]))


def find_lunar_hour(day_gz):
    """根据日干支找时柱起点(五鼠遁)"""
    result = multi_key_dict_get(fiverats, day_gz[0])
    if result is None:
        result = multi_key_dict_get(fiverats, day_gz[1])
    return dict(zip(list(di_zhi), new_list(jiazi(), result)[:12]))


def find_lunar_ke(hour_gz):
    """根据时干支找刻柱起点(五马遁)"""
    result = multi_key_dict_get(fivehourses, hour_gz[0])
    if result is None:
        result = multi_key_dict_get(fivehourses, hour_gz[1])
    return new_list(jiazi(), result)


def ke_jiazi_d(zi_hour_gz):
    """生成刻柱字典,每10分钟一换"""
    t = [f"{h}:{m}0" for h in range(24) for m in range(6)]
    zi_ke = find_lunar_ke(zi_hour_gz)
    minutelist = dict(zip(t, cycle(repeat_list(1, zi_ke))))
    return minutelist


def get_month_ganzhi_by_jieqi(year, month, day, hour, minute, year_ganzhi):
    """根据节气计算月干支"""
    current_jq = get_current_jieqi(year, month, day, hour, minute)
    month_dizhi = jieqi_to_dizhi.get(current_jq, '寅')
    
    year_gan = year_ganzhi[0]
    start_gan = multi_key_dict_get(fivetigers, year_gan)
    if start_gan is None:
        start_gan = multi_key_dict_get(fivetigers, year_ganzhi[1])
    start_gan = start_gan[0] if start_gan else '丙'
    
    dizhi_order = ['寅', '卯', '辰', '巳', '午', '未', '申', '酉', '戌', '亥', '子', '丑']
    gan_order = list(tian_gan)
    
    start_idx = dizhi_order.index('寅')
    current_idx = dizhi_order.index(month_dizhi)
    offset = current_idx - start_idx
    start_gan_idx = gan_order.index(start_gan)
    month_gan = gan_order[(start_gan_idx + offset) % 10]
    
    return f"{month_gan}{month_dizhi}"


def gangzhi(year, month, day, hour, minute):
    """
    计算五柱干支:年柱、月柱、日柱、时柱、刻柱
    基于 lunar-python 库
    """
    if not LUNAR_AVAILABLE:
        raise ImportError("lunar-python 库未安装")
    
    # 创建 Solar 对象
    solar = Solar.fromYmdHms(year, month, day, hour, minute, 0)
    lunar = solar.getLunar()
    
    # 年柱
    year_gz = lunar.getYearInGanZhi()
    
    # 月柱(按节气)
    month_gz = lunar.getMonthInGanZhi()
    # 或者用自定义节气算法
    # month_gz = get_month_ganzhi_by_jieqi(year, month, day, hour, minute, year_gz)
    
    # 日柱
    day_gz = lunar.getDayInGanZhi()
    
    # 时柱
    hour_gz = lunar.getTimeInGanZhi()
    
    # 刻柱:以当日子时为起点
    # 获取子时的干支
    zi_solar = Solar.fromYmdHms(year, month, day, 0, 0, 0)
    zi_lunar = zi_solar.getLunar()
    zi_hour_gz = zi_lunar.getTimeInGanZhi()
    
    # 生成刻柱
    ke_dict = ke_jiazi_d(zi_hour_gz)
    m = minute // 10
    key = f"{hour}:{m}0"
    ke_gz = ke_dict.get(key, '未知')
    
    return [year_gz, month_gz, day_gz, hour_gz, ke_gz]


def get_lunar_date_info(year, month, day):
    """获取农历日期信息"""
    if not LUNAR_AVAILABLE:
        return {"年": year, "农历月": "未知", "月": month, "日": day, "日名称": "未知"}
    
    try:
        solar = Solar.fromYmd(year, month, day)
        lunar = solar.getLunar()
        
        lunar_year = lunar.getYearInChinese()
        lunar_month = lunar.getMonth()
        lunar_day = lunar.getDay()
        lunar_month_name = lunar_month_names[lunar_month] if 0 < lunar_month < 13 else "未知"
        lunar_day_name = lunar_day_names[lunar_day - 1] if 0 < lunar_day <= 30 else "未知"
        
        return {
            "年": lunar_year,
            "农历月": lunar_month_name,
            "月": lunar_month,
            "日": lunar_day,
            "日名称": lunar_day_name,
            "干支年": lunar.getYearInGanZhi(),
            "是否闰月": lunar.getMonth() != lunar.getMonth()
        }
    except Exception as e:
        return {"年": year, "农历月": "未知", "月": month, "日": day, "日名称": "未知", "错误": str(e)}


# ==================== GUI - 移动端优化版 ====================

class WuzhuGUI:
    def __init__(self, root):
        self.root = root
        self.root.title("五柱十字万年历 v2.0 (lunar-python版)")
        self.root.geometry("900x850")
        
        self.setup_styles()
        self.create_ui()
        self.show_current()
    
    def setup_styles(self):
        style = ttk.Style()
        style.theme_use('clam')
        style.configure('Title.TLabelframe', font=('微软雅黑', 10, 'bold'))
        style.configure('Title.TLabelframe.Label', font=('微软雅黑', 10, 'bold'))
        style.configure('TButton', font=('微软雅黑', 12))
        style.configure('Big.TButton', font=('微软雅黑', 14, 'bold'))
    
    def create_ui(self):
        main_frame = ttk.Frame(self.root, padding="10")
        main_frame.pack(fill=tk.BOTH, expand=True)
        
        # ========== 输入面板 ==========
        input_frame = ttk.LabelFrame(main_frame, text="时间输入", 
                                      padding="10", style='Title.TLabelframe')
        input_frame.pack(fill=tk.X, pady=(0, 10))
        
        # === 年月日 ===
        date_frame = ttk.Frame(input_frame)
        date_frame.pack(pady=5)
        
        # 年
        ttk.Label(date_frame, text="年:", font=('微软雅黑', 12)).pack(side=tk.LEFT, padx=5)
        self.year_var = tk.StringVar(value=str(datetime.now().year))
        self.year_entry = tk.Entry(date_frame, textvariable=self.year_var, 
                                    width=6, font=('微软雅黑', 14), justify='center')
        self.year_entry.pack(side=tk.LEFT, padx=5)
        self.year_entry.bind('<FocusIn>', lambda e: self.on_entry_focus(e))
        
        year_btn_frame = ttk.Frame(date_frame)
        year_btn_frame.pack(side=tk.LEFT, padx=5)
        ttk.Button(year_btn_frame, text="-", width=2, command=lambda: self.adjust_year(-1)).pack(side=tk.LEFT)
        ttk.Button(year_btn_frame, text="+", width=2, command=lambda: self.adjust_year(1)).pack(side=tk.LEFT)
        
        # 月
        ttk.Label(date_frame, text="月:", font=('微软雅黑', 12)).pack(side=tk.LEFT, padx=5)
        self.month_var = tk.StringVar(value=str(datetime.now().month))
        self.month_entry = tk.Entry(date_frame, textvariable=self.month_var, 
                                     width=4, font=('微软雅黑', 14), justify='center')
        self.month_entry.pack(side=tk.LEFT, padx=5)
        self.month_entry.bind('<FocusIn>', lambda e: self.on_entry_focus(e))
        
        month_btn_frame = ttk.Frame(date_frame)
        month_btn_frame.pack(side=tk.LEFT, padx=5)
        ttk.Button(month_btn_frame, text="-", width=2, command=lambda: self.adjust_month(-1)).pack(side=tk.LEFT)
        ttk.Button(month_btn_frame, text="+", width=2, command=lambda: self.adjust_month(1)).pack(side=tk.LEFT)
        
        # 日
        ttk.Label(date_frame, text="日:", font=('微软雅黑', 12)).pack(side=tk.LEFT, padx=5)
        self.day_var = tk.StringVar(value=str(datetime.now().day))
        self.day_entry = tk.Entry(date_frame, textvariable=self.day_var, 
                                   width=4, font=('微软雅黑', 14), justify='center')
        self.day_entry.pack(side=tk.LEFT, padx=5)
        self.day_entry.bind('<FocusIn>', lambda e: self.on_entry_focus(e))
        
        day_btn_frame = ttk.Frame(date_frame)
        day_btn_frame.pack(side=tk.LEFT, padx=5)
        ttk.Button(day_btn_frame, text="-", width=2, command=lambda: self.adjust_day(-1)).pack(side=tk.LEFT)
        ttk.Button(day_btn_frame, text="+", width=2, command=lambda: self.adjust_day(1)).pack(side=tk.LEFT)
        
        # === 时分 ===
        time_frame = ttk.Frame(input_frame)
        time_frame.pack(pady=5)
        
        ttk.Label(time_frame, text="时:", font=('微软雅黑', 12)).pack(side=tk.LEFT, padx=5)
        self.hour_var = tk.StringVar(value=f"{datetime.now().hour:02d}")
        self.hour_entry = tk.Entry(time_frame, textvariable=self.hour_var, 
                                    width=4, font=('微软雅黑', 14), justify='center')
        self.hour_entry.pack(side=tk.LEFT, padx=5)
        self.hour_entry.bind('<FocusIn>', lambda e: self.on_entry_focus(e))
        
        hour_btn_frame = ttk.Frame(time_frame)
        hour_btn_frame.pack(side=tk.LEFT, padx=5)
        ttk.Button(hour_btn_frame, text="-", width=2, command=lambda: self.adjust_hour(-1)).pack(side=tk.LEFT)
        ttk.Button(hour_btn_frame, text="+", width=2, command=lambda: self.adjust_hour(1)).pack(side=tk.LEFT)
        
        ttk.Label(time_frame, text="分:", font=('微软雅黑', 12)).pack(side=tk.LEFT, padx=5)
        self.minute_var = tk.StringVar(value=f"{datetime.now().minute:02d}")
        self.minute_entry = tk.Entry(time_frame, textvariable=self.minute_var, 
                                      width=4, font=('微软雅黑', 14), justify='center')
        self.minute_entry.pack(side=tk.LEFT, padx=5)
        self.minute_entry.bind('<FocusIn>', lambda e: self.on_entry_focus(e))
        
        minute_btn_frame = ttk.Frame(time_frame)
        minute_btn_frame.pack(side=tk.LEFT, padx=5)
        ttk.Button(minute_btn_frame, text="-", width=2, command=lambda: self.adjust_minute(-10)).pack(side=tk.LEFT)
        ttk.Button(minute_btn_frame, text="+", width=2, command=lambda: self.adjust_minute(10)).pack(side=tk.LEFT)
        
        # === 快速时间选择按钮 ===
        quick_frame = ttk.Frame(input_frame)
        quick_frame.pack(pady=10)
        
        quick_hours = [
            ("子时(23-1)", 0), ("卯时(5-7)", 6), ("午时(11-13)", 12), 
            ("酉时(17-19)", 18), ("当前时间", -1)
        ]
        for name, h in quick_hours:
            if h == -1:
                ttk.Button(quick_frame, text=f"🕛 {name}", command=self.show_current, width=14).pack(side=tk.LEFT, padx=2)
            else:
                ttk.Button(quick_frame, text=f"🕐 {name}", command=lambda hr=h: self.set_hour(hr), width=14).pack(side=tk.LEFT, padx=2)
        
        # === 主操作按钮 ===
        btn_frame = ttk.Frame(input_frame)
        btn_frame.pack(pady=10)
        
        self.calc_btn = ttk.Button(btn_frame, text="▶ 开始排盘", 
                                    command=self.calculate, width=15, style='Big.TButton')
        self.calc_btn.pack(side=tk.LEFT, padx=10)
        
        self.clear_btn = ttk.Button(btn_frame, text="🗑 清空", 
                                     command=self.clear_result, width=10)
        self.clear_btn.pack(side=tk.LEFT, padx=5)
        
        # ========== 结果显示面板 ==========
        result_frame = ttk.LabelFrame(main_frame, text="排盘结果", 
                                       padding="10", style='Title.TLabelframe')
        result_frame.pack(fill=tk.BOTH, expand=True)
        
        self.result_text = scrolledtext.ScrolledText(
            result_frame, wrap=tk.WORD, font=('微软雅黑', 12),
            width=80, height=28, bg='#f5f5f5'
        )
        self.result_text.pack(fill=tk.BOTH, expand=True)
        
        # 配置标签样式
        self.result_text.tag_config('title', font=('微软雅黑', 16, 'bold'), foreground='#2c3e50')
        self.result_text.tag_config('subtitle', font=('微软雅黑', 13, 'bold'), foreground='#34495e')
        self.result_text.tag_config('ganzhi', font=('微软雅黑', 15, 'bold'), foreground='#c0392b')
        self.result_text.tag_config('info', font=('微软雅黑', 11), foreground='#7f8c8d')
        self.result_text.tag_config('correct', font=('微软雅黑', 11), foreground='#27ae60')
        self.result_text.tag_config('big', font=('微软雅黑', 18, 'bold'), foreground='#8e44ad')
        self.result_text.tag_config('highlight', font=('微软雅黑', 12, 'bold'), foreground='#e74c3c')
    
    # ========== 焦点处理 ==========
    def on_entry_focus(self, event):
        widget = event.widget
        widget.selection_range(0, tk.END)
    
    # ========== 数值调整 ==========
    def adjust_year(self, delta):
        try:
            v = int(self.year_var.get()) + delta
            self.year_var.set(str(v))
        except:
            pass
    
    def adjust_month(self, delta):
        try:
            v = int(self.month_var.get()) + delta
            if 1 <= v <= 12:
                self.month_var.set(str(v))
        except:
            pass
    
    def adjust_day(self, delta):
        try:
            v = int(self.day_var.get()) + delta
            if 1 <= v <= 31:
                self.day_var.set(str(v))
        except:
            pass
    
    def adjust_hour(self, delta):
        try:
            v = int(self.hour_var.get()) + delta
            v = v % 24
            self.hour_var.set(f"{v:02d}")
        except:
            pass
    
    def adjust_minute(self, delta):
        try:
            v = int(self.minute_var.get()) + delta
            v = max(0, min(59, v))
            self.minute_var.set(f"{v:02d}")
        except:
            pass
    
    def set_hour(self, h):
        self.hour_var.set(f"{h:02d}")
        self.minute_var.set("00")
    
    # ========== 核心功能 ==========
    def show_current(self):
        now = datetime.now(pytz.timezone('Asia/Hong_Kong'))
        self.year_var.set(str(now.year))
        self.month_var.set(str(now.month))
        self.day_var.set(str(now.day))
        self.hour_var.set(f"{now.hour:02d}")
        self.minute_var.set(f"{now.minute:02d}")
        self.calculate()
    
    def calculate(self):
        try:
            year = int(self.year_var.get())
            month = int(self.month_var.get())
            day = int(self.day_var.get())
            hour = int(self.hour_var.get())
            minute = int(self.minute_var.get())
            
            # 验证日期
            try:
                dt = datetime(year, month, day, hour, minute)
            except ValueError:
                messagebox.showerror("错误", f"日期无效:{year}-{month}-{day}")
                return
            
            # 计算五柱
            gz = gangzhi(year, month, day, hour, minute)
            
            # 获取节气信息
            jieqi_info = get_jieqi_info(year, month, day, hour, minute)
            current_jq = get_current_jieqi(year, month, day, hour, minute)
            
            # 获取农历信息
            lunar = get_lunar_date_info(year, month, day)
            
            # 显示结果
            self.display_result(year, month, day, hour, minute, gz, current_jq, jieqi_info, lunar)
            
        except ImportError as e:
            messagebox.showerror("错误", str(e) + "\n请安装lunar-python库:pip install lunar-python")
        except Exception as e:
            messagebox.showerror("错误", f"排盘失败:{str(e)}")
            import traceback
            traceback.print_exc()
    
    def display_result(self, year, month, day, hour, minute, gz, current_jq, jieqi_info, lunar):
        self.result_text.delete(1.0, tk.END)
        
        # 标题
        self.result_text.insert(tk.END, "=" * 50 + "\n", 'title')
        self.result_text.insert(tk.END, "      五柱十字干支万年历\n", 'title')
        self.result_text.insert(tk.END, "      (基于 lunar-python 库)\n", 'info')
        self.result_text.insert(tk.END, "=" * 50 + "\n\n", 'title')
        
        # 公历时间
        self.result_text.insert(tk.END, "【公历时间】\n", 'subtitle')
        self.result_text.insert(tk.END, "-" * 35 + "\n")
        self.result_text.insert(tk.END, f"{year}{month}{day}{hour:02d}:{minute:02d}\n")
        weekday = ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
        wd = datetime(year, month, day).weekday()
        self.result_text.insert(tk.END, f"{weekday[wd]}\n\n")
        
        # 农历
        self.result_text.insert(tk.END, "【农历】\n", 'subtitle')
        self.result_text.insert(tk.END, "-" * 35 + "\n")
        if lunar.get("农历月") != "未知":
            self.result_text.insert(tk.END, f"{lunar['年']}{lunar['农历月']}{lunar['日名称']}{hour:02d}:{minute:02d}\n", 'highlight')

            weekday = ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
            wd = datetime(year, month, day).weekday()
            self.result_text.insert(tk.END, f"{weekday[wd]}\n\n")
            
            self.result_text.insert(tk.END, f"(干支年: {lunar.get('干支年', '')})\n\n")
        else:
            self.result_text.insert(tk.END, "(需安装 lunar-python 库)\n\n")
        
        # 节气
        self.result_text.insert(tk.END, "【节气】\n", 'subtitle')
        self.result_text.insert(tk.END, "-" * 35 + "\n")
        self.result_text.insert(tk.END, f"当前节气:{current_jq}\n", 'highlight')
        
        if jieqi_info:
            if jieqi_info.get("prev"):
                p = jieqi_info["prev"]
                self.result_text.insert(tk.END, f"上一节气:{p['节气']} {p['月']}-{p['日']} {p['时']:02d}:{p['分']:02d}\n")
            if jieqi_info.get("next"):
                n = jieqi_info["next"]
                self.result_text.insert(tk.END, f"下一节气:{n['节气']} {n['月']}-{n['日']} {n['时']:02d}:{n['分']:02d}\n")
        self.result_text.insert(tk.END, "\n")
        
        # 五柱十字
        self.result_text.insert(tk.END, "【五柱十字】\n", 'subtitle')
        self.result_text.insert(tk.END, "-" * 35 + "\n")
        
        zhu_names = ["年柱", "月柱", "日柱", "时柱", "刻柱"]
        zhu_icons = ["🏛", "🌙", "☀", "⏰", "⚡"]
        
        for i, (name, icon) in enumerate(zip(zhu_names, zhu_icons)):
            if i < len(gz) and gz[i]:
                self.result_text.insert(tk.END, f"{icon} {name}:", 'info')
                self.result_text.insert(tk.END, f"{gz[i]}\n", 'big')
        
        # 完整格式
        self.result_text.insert(tk.END, "\n【完整格式】\n", 'subtitle')
        self.result_text.insert(tk.END, "-" * 35 + "\n")
        full_str = "  ".join([g for g in gz if g])
        self.result_text.insert(tk.END, f"{full_str}\n\n", 'ganzhi')
        
        # 纳音五行
        self.result_text.insert(tk.END, "【纳音五行】\n", 'subtitle')
        self.result_text.insert(tk.END, "-" * 35 + "\n")
        for i, name in enumerate(zhu_names):
            if i < len(gz) and gz[i]:
                nayin = nayin_dict.get(gz[i], '未知')
                self.result_text.insert(tk.END, f"{name}{gz[i]}{nayin}\n", 'info')
        
        # 八字扩展信息
        self.result_text.insert(tk.END, "\n【八字扩展信息】\n", 'subtitle')
        self.result_text.insert(tk.END, "-" * 35 + "\n")
        try:
            solar = Solar.fromYmdHms(year, month, day, hour, minute, 0)
            lunar_obj = solar.getLunar()
            self.result_text.insert(tk.END, f"生肖:{lunar_obj.getYearShengXiao()}\n")
            self.result_text.insert(tk.END, f"星座:{solar.getXingZuo()}\n")
            self.result_text.insert(tk.END, f"星期:{lunar_obj.getWeekInChinese()}\n")
        except:
            pass
        
        # 底部说明
        self.result_text.insert(tk.END, "\n" + "=" * 50 + "\n", 'info')
        self.result_text.insert(tk.END, "【说明】\n", 'info')
        self.result_text.insert(tk.END, "刻柱以当日子时为五马遁起点\n", 'correct')
        self.result_text.insert(tk.END, "月柱按节气划分,非农历月份\n", 'correct')
        self.result_text.insert(tk.END, "仅供国学文化研究参考\n", 'info')
        self.result_text.insert(tk.END, "=" * 50 + "\n")
    
    def clear_result(self):
        self.result_text.delete(1.0, tk.END)


def main():
    if not LUNAR_AVAILABLE:
        print("警告:lunar-python 库未安装")
        print("请运行:pip install lunar-python")
    
    root = tk.Tk()
    app = WuzhuGUI(root)
    root.mainloop()


if __name__ == "__main__":
    main()

更多推荐