python语言基于lunar-python库的五柱十字干支万年历软件代码QZQ
·
# -*- 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()
更多推荐
所有评论(0)