欢迎光临
我们一直在努力

python语言数字奇门遁甲标准版 - 时家奇门转盘拆补法 v3.8 (完整版带析盘断局)代码QZQ

import tkinter as tk
from tkinter import ttk, scrolledtext
from datetime import datetime, date
import traceback
import re

# 使用内置算法,禁用Skyfield
SKYFIELD_AVAILABLE = False

class DigitalQiMenDunJia:
def __init__(self, root):
self.root = root
self.root.title("数字奇门遁甲标准版 – 时家奇门转盘拆补法 v3.8 (完整版带析盘断局)")
self.root.geometry("850×1200") # 增加高度以容纳更多内容

# 基础数据定义
self.tiangan = ['甲', '乙', '丙', '丁', '戊', '己', '庚', '辛', '壬', '癸']
self.dizhi = ['子', '丑', '寅', '卯', '辰', '巳', '午', '未', '申', '酉', '戌', '亥']

# 六十甲子表
self.jiazi_table = [
'甲子', '乙丑', '丙寅', '丁卯', '戊辰', '己巳', '庚午', '辛未', '壬申', '癸酉',
'甲戌', '乙亥', '丙子', '丁丑', '戊寅', '己卯', '庚辰', '辛巳', '壬午', '癸未',
'甲申', '乙酉', '丙戌', '丁亥', '戊子', '己丑', '庚寅', '辛卯', '壬辰', '癸巳',
'甲午', '乙未', '丙申', '丁酉', '戊戌', '己亥', '庚子', '辛丑', '壬寅', '癸卯',
'甲辰', '乙巳', '丙午', '丁未', '戊申', '己酉', '庚戌', '辛亥', '壬子', '癸丑',
'甲寅', '乙卯', '丙辰', '丁巳', '戊午', '己未', '庚申', '辛酉', '壬戌', '癸亥'
]

# 天干与九干的对应关系
self.tiangan_to_jiugan = {
'甲': '戊', '乙': '乙', '丙': '丙', '丁': '丁', '戊': '戊',
'己': '己', '庚': '庚', '辛': '辛', '壬': '壬', '癸': '癸'
}

# 九干对应数
self.jiugan_num = {'戊': 1, '己': 2, '庚': 3, '辛': 4, '壬': 5, '癸': 6, '丁': 7, '丙': 8, '乙': 9}
self.num_to_jiugan = {1: '戊', 2: '己', 3: '庚', 4: '辛', 5: '壬', 6: '癸', 7: '丁', 8: '丙', 9: '乙'}

# 九星对应数
self.jiuxing_num = {
'天蓬': 1, '天任': 8, '天冲': 3, '天辅': 4,
'天英': 9, '天芮': 2, '天柱': 7, '天心': 6, '天禽': 5
}
self.num_to_jiuxing = {1: '天蓬', 2: '天芮', 3: '天冲', 4: '天辅', 5: '天禽', 6: '天心', 7: '天柱', 8: '天任', 9: '天英'}

# 九门对应数
self.bamen_num = {
'休': 1, '生': 8, '伤': 3, '杜': 4,
'景': 9, '死': 2, '惊': 7, '开': 6, '中': 5
}
self.num_to_bamen = {1: '休', 2: '死', 3: '伤', 4: '杜', 5: '中', 6: '开', 7: '惊', 8: '生', 9: '景'}

# 九神对应数
self.bashen_num = {
'值符': 1, '腾蛇': 8, '太阴': 3, '六合': 4,
'明王': 5, '白虎': 9, '玄武': 2, '九地': 7, '九天': 6
}
self.num_to_bashen = {
1: '值符', 8: '腾蛇', 3: '太阴', 4: '六合',
5: '明王', 9: '白虎', 2: '玄武', 7: '九地', 6: '九天'
}

# 时干序号
self.shigan_xuhao = {'甲': 1, '乙': 2, '丙': 3, '丁': 4, '戊': 5, '己': 6, '庚': 7, '辛': 8, '壬': 9, '癸': 10}

# 九星本位宫
self.xing_benwei = {
'天蓬': 1, '天任': 8, '天冲': 3, '天辅': 4,
'天英': 9, '天芮': 2, '天柱': 7, '天心': 6, '天禽': 5
}

# 八门本位宫
self.men_benwei = {
'休': 1, '生': 8, '伤': 3, '杜': 4,
'景': 9, '死': 2, '惊': 7, '开': 6
}

# 八神本位宫
self.bashen_benwei = {
'值符': 1, '腾蛇': 8, '太阴': 3, '六合': 4,
'白虎': 9, '玄武': 2, '九地': 7, '九天': 6
}

# 洛书圆环八宫顺时针顺序
self.luoshu_clockwise = [1, 8, 3, 4, 9, 2, 7, 6]

# 节气局数
self.solar_terms = {
'冬至': {'宫': 1, '遁': '阳'}, '小寒': {'宫': 2, '遁': '阳'}, '大寒': {'宫': 3, '遁': '阳'},
'立春': {'宫': 8, '遁': '阳'}, '雨水': {'宫': 9, '遁': '阳'}, '惊蛰': {'宫': 1, '遁': '阳'},
'春分': {'宫': 3, '遁': '阳'}, '清明': {'宫': 4, '遁': '阳'}, '谷雨': {'宫': 5, '遁': '阳'},
'立夏': {'宫': 4, '遁': '阳'}, '小满': {'宫': 5, '遁': '阳'}, '芒种': {'宫': 6, '遁': '阳'},
'夏至': {'宫': 9, '遁': '阴'}, '小暑': {'宫': 8, '遁': '阴'}, '大暑': {'宫': 7, '遁': '阴'},
'立秋': {'宫': 2, '遁': '阴'}, '处暑': {'宫': 1, '遁': '阴'}, '白露': {'宫': 9, '遁': '阴'},
'秋分': {'宫': 7, '遁': '阴'}, '寒露': {'宫': 6, '遁': '阴'}, '霜降': {'宫': 5, '遁': '阴'},
'立冬': {'宫': 6, '遁': '阴'}, '小雪': {'宫': 5, '遁': '阴'}, '大雪': {'宫': 4, '遁': '阴'}
}

# 2026年精准节气表
self.precise_jieqi_2026 = [
(1, 5, 23, 29, '小寒'), (1, 20, 16, 47, '大寒'),
(2, 4, 10, 33, '立春'), (2, 19, 6, 24, '雨水'),
(3, 5, 21, 58, '惊蛰'), (3, 20, 22, 45, '春分'),
(4, 5, 2, 39, '清明'), (4, 20, 9, 33, '谷雨'),
(5, 5, 19, 44, '立夏'), (5, 21, 8, 51, '小满'),
(6, 5, 22, 3, '芒种'), (6, 21, 14, 50, '夏至'),
(7, 7, 8, 17, '小暑'), (7, 22, 23, 41, '大暑'),
(8, 7, 16, 2, '立秋'), (8, 23, 6, 53, '处暑'),
(9, 7, 19, 11, '白露'), (9, 22, 18, 19, '秋分'),
(10, 8, 14, 29, '寒露'), (10, 23, 17, 37, '霜降'),
(11, 7, 17, 38, '立冬'), (11, 22, 15, 2, '小雪'),
(12, 7, 10, 35, '大雪'), (12, 21, 7, 27, '冬至')
]

self.solar_term_names = [
'小寒', '大寒', '立春', '雨水', '惊蛰', '春分',
'清明', '谷雨', '立夏', '小满', '芒种', '夏至',
'小暑', '大暑', '立秋', '处暑', '白露', '秋分',
'寒露', '霜降', '立冬', '小雪', '大雪', '冬至'
]

# ========== 新增:奇门格局解析库 ==========
self.init_analysis_library()

self.setup_ui()

def init_analysis_library(self):
"""初始化奇门格局解析库"""

# 十干克应(天盘干加地盘干)
self.gan_ying = {
# 戊
('戊', '戊'): '戊加戊:伏吟格,凡事闭塞静守吉',
('戊', '乙'): '戊加乙:青龙合灵格,门吉事吉门反凶',
('戊', '丙'): '戊加丙:青龙返首格,动吉若刑吉成凶',
('戊', '丁'): '戊加丁:青龙耀明格,墓招是非求名吉',
('戊', '己'): '戊加己:贵人入狱格,凡是公私皆不利',
('戊', '庚'): '戊加庚:值符飞宫格,吉事不吉凶更凶',
('戊', '辛'): '戊加辛:青龙折足格,吉门助谋凶门灾',
('戊', '壬'): '戊加壬:青龙入天牢,凡是阴阳皆不吉',
('戊', '癸'): '戊加癸:青龙华盖格,吉格吉福门凶乖',

# 乙
('乙', '戊'): '乙加戊:利阴害阳格,财破人伤门凶迫',
('乙', '乙'): '乙加乙:日奇伏吟格,不宜求名可安分',
('乙', '丙'): '乙加丙:奇仪顺遂格,吉星进职凶亲离',
('乙', '丁'): '乙加丁:奇仪相佐格,百事可为文书吉',
('乙', '己'): '乙加己:日奇入雾格,得门地遁凶门凶',
('乙', '庚'): '乙加庚:日奇被刑格,夫妻怀私争财产',
('乙', '辛'): '乙加辛:青龙逃走格,六畜皆伤奴仆拐',
('乙', '壬'): '乙加壬:日奇入地格,尊卑悖乱讼是非',
('乙', '癸'): '乙加癸:华盖逢星格,宜遁修道躲灾难',

# 丙
('丙', '戊'): '丙加戊:飞鸟跌穴格,谋为百事皆洞澈',
('丙', '乙'): '丙加乙:日月并行格,公谋私为皆吉利',
('丙', '丙'): '丙加丙:月奇孛师格,破耗遗失文书迫',
('丙', '丁'): '丙加丁:月奇朱雀格,得门天遁贵人吉',
('丙', '己'): '丙加己:太孛入刑格,吉门得吉凶门凶',
('丙', '庚'): '丙加庚:荧入太白格,门户破败盗贼失',
('丙', '辛'): '丙加辛:谋事就成格,病人不凶亦莫为',
('丙', '壬'): '丙加壬:火入天罗格,为客不利是非多',
('丙', '癸'): '丙加癸:华盖孛师格,阴人害事灾祸生',

# 丁
('丁', '戊'): '丁加戊:青龙转光格,官人升迁常人昌',
('丁', '乙'): '丁加乙:人遁吉格,加官进爵婚财喜',
('丁', '丙'): '丁加丙:星随月转格,贵人高升乐生悲',
('丁', '丁'): '丁加丁:奇入太阴格,喜事遂心文书至',
('丁', '己'): '丁加己:火入勾陈格,奸私雠冤事因女',
('丁', '庚'): '丁加庚:年月日时格,文书阻隔行人归',
('丁', '辛'): '丁加辛:朱雀入狱格,罪人释囚官失位',
('丁', '壬'): '丁加壬:五神互合格,贵人恩昭讼狱公',
('丁', '癸'): '丁加癸:朱雀投江格,文书舌消音信溺',

# 己
('己', '戊'): '己加戊:犬遇青龙格,门凶枉劳吉门遂',
('己', '乙'): '己加乙:墓神不明格,地户蓬星宜隐遁',
('己', '丙'): '己加丙:火孛地户格,阳人冤枉阴人污',
('己', '丁'): '己加丁:朱雀入墓格,先曲后直文词讼',
('己', '己'): '己加己:地户逢鬼格,百事不遂病必死',
('己', '庚'): '己加庚:刑格凶,先动不利阴谋害',
('己', '辛'): '己加辛:游魂入墓格,大人鬼魅小人祟',
('己', '壬'): '己加壬:地网高张格,狡童佚女奸情杀',
('己', '癸'): '己加癸:地刑玄武格,男女病危讼狱灾',

# 庚
('庚', '戊'): '庚加戊:太白天乙伏,百事不可谋为凶',
('庚', '乙'): '庚加乙:太白蓬星格,退吉进凶止宜退',
('庚', '丙'): '庚加丙:太白入荧格,贼来客利主破财',
('庚', '丁'): '庚加丁:亭亭之格名,因私官司门吉利',
('庚', '己'): '庚加己:刑格,官司难避被重刑',
('庚', '庚'): '庚加庚:太白同宫格,官灾横祸兄弟攻',
('庚', '辛'): '庚加辛:白虎干格凶,远行车折马又死',
('庚', '壬'): '庚加壬:远行失迷路,男女音信嗟呀矣',
('庚', '癸'): '庚加癸:大格凶,行人至此官司止,生产母子俱伤也',

# 辛
('辛', '戊'): '辛加戊:困龙被伤格,官司破败很不利,屈抑守分动祸殃',
('辛', '乙'): '辛加乙:白虎猖狂格,人亡家败远行殃,尊长不喜车船伤',
('辛', '丙'): '辛加丙:干合孛师格,荧惑出现占雨无,事因财讼占晴旱',
('辛', '丁'): '辛加丁:狱神得奇,更适经商获倍利,又有因人逢赦宥',
('辛', '己'): '辛加己:入狱自刑,讼诉难伸奴仆背',
('辛', '庚'): '辛加庚:白虎出力格,主客相残逊让退,血溅衣衫稍强进',
('辛', '辛'): '辛加辛:伏吟天庭格,公废私就请细辨,讼狱自罹罪名兮',
('辛', '壬'): '辛加壬:凶蛇入狱格,两男争女讼狱频,先动失理勿争论',
('辛', '癸'): '辛加癸:天牢华盖格,日月失明入天网,又接动止乖张矣',

# 壬
('壬', '戊'): '壬加戊:小蛇化龙格,男人发达女产婴',
('壬', '乙'): '壬加乙:小蛇格,男人嗟呀女柔顺,孕生子禄马光华',
('壬', '丙'): '壬加丙:水蛇入火格,官灾刑禁络不绝',
('壬', '丁'): '壬加丁:干合蛇刑格,贵人匆匆文书牵,男凶女吉男不宜',
('壬', '己'): '壬加己:凶蛇入狱格,大祸将至顺守吉,词讼理曲不宜讼',
('壬', '庚'): '壬加庚:太白擒蛇格,立剖邪正刑狱公',
('壬', '辛'): '壬加辛:螣蛇相缠格,纵得吉门亦不安,若有谋望被欺瞒',
('壬', '壬'): '壬加壬:蛇入地罗格,外人缠绕内事索,门吉星凶庶免失',
('壬', '癸'): '壬加癸:幼女奸淫格,家有丑声门星吉,反祸福隆又有利',

# 癸
('癸', '戊'): '癸加戊:天乙会合吉,财喜婚人助成合,若门凶迫反招非',
('癸', '乙'): '癸加乙:华盖蓬星格,贵人禄位常人安',
('癸', '丙'): '癸加丙:华盖孛师格,贵贱逢之上人喜',
('癸', '丁'): '癸加丁:螣蛇妖矫格,文书官司焚莫逃',
('癸', '己'): '癸加己:华盖地户格,男女占之书信阻,躲灾避难方为吉',
('癸', '庚'): '癸加庚:太白入网格,以暴争讼力平矣',
('癸', '辛'): '癸加辛:网盖天牢格,占讼病死罪莫逃',
('癸', '壬'): '癸加壬:复见螣蛇格,嫁出娶进重婚者,后嫁无子失年华',
('癸', '癸'): '癸加癸:天网四张格,行人失伴病讼伤',
}

# 三奇到宫克应
self.sanqi_daogong = {
('乙', 6): '乙奇到乾:玉兔入天门,有人着黄衣至,或扛钱过为应',
('乙', 1): '乙奇到坎:玉兔投泉,有人着皂衣至,或有鼓声为应',
('乙', 8): '乙奇到艮:玉兔步贵,有人着白衣至,或缠物来为应',
('乙', 3): '乙奇到震:日出扶桑,有渔猎人至,并小儿二人同来为应',
('乙', 4): '乙奇到巽:玉兔乘风,有白衣人骑马过,或小儿作戏耍为应',
('乙', 9): '乙奇到离:玉兔当阳,有人着色衣为应',
('乙', 2): '乙奇到坤:玉兔入坤,有三、五人至为应',
('乙', 7): '乙奇到兑:玉女受制,有三、五少妇至,或鸟鹊成群为应',

('丙', 6): '丙奇到乾:天成天权,有披衣人至,或鸟鹊成队飞来为应',
('丙', 1): '丙奇到坎:丙火烧壬,有瞽目人至,及北方有鸟飞来为应',
('丙', 8): '丙奇到艮:凤入丹山,有人着青衣至,小儿哭泣或童子手拿铜铁器物为应',
('丙', 3): '丙奇到震:月入雷门,有武大将军器至,若春天有雷声或鼓声为应',
('丙', 4): '丙奇到巽:火行风起,有鼓音歌乐为应',
('丙', 9): '丙奇到离:月照端门,有黄色飞禽成对来为应',
('丙', 2): '丙奇到坤:子居母舍,有皂衣人至,或鸟鹊在南方鸣为应',
('丙', 7): '丙奇到兑:凤凰折翅,有人持杖并拿酒器及抱小儿为应',

('丁', 6): '丁奇到乾:火到天门,有人持刀刃至或牵马过为应',
('丁', 1): '丁奇到坎:朱雀投江,有人抱小儿来,南方云雨至为应',
('丁', 8): '丁奇到艮:玉女乘云,有人与小儿打狗为应',
('丁', 3): '丁奇到震:最明,有二女子着青衣至,或双夫妇至为应',
('丁', 4): '丁奇到巽:美女留神,有小儿骑马过,南方云起,北方下雨为应',
('丁', 9): '丁奇到离:乘龙万里,有蹶足人或瞎眼人至,及小儿骑马过为应',
('丁', 2): '丁奇到坤:玉女游地,有女人着青衣至,与僧道同行为应',
('丁', 7): '丁奇到兑:玉女游天门,有人抱文书印簿至,或赶牛羊鹿为应',
}

# 星门克应
self.xingmen_ying = {
('天蓬', '休'): '蓬休:披枷戴锁,锒铛入狱小凶',
('天蓬', '生'): '蓬生:纵欲无度,尽兴不返大吉',
('天蓬', '伤'): '蓬伤:大难临头,六宅不安小凶',
('天蓬', '杜'): '蓬杜:十年寒窗,不得一举小凶',
('天蓬', '景'): '蓬景:万事具备,只欠东风小凶',
('天蓬', '死'): '蓬死:夺戒口食,剥戒身衣小凶',
('天蓬', '惊'): '蓬惊:别生枝节,何所取义小凶',
('天蓬', '开'): '蓬开:三年不鸣,一鸣惊人大吉',

('天芮', '休'): '芮休:一以当千,南争北战大吉',
('天芮', '生'): '芮生:力不从心,望尘莫及小凶',
('天芮', '伤'): '芮伤:七窃生烟,九世之仇小凶',
('天芮', '杜'): '芮杜:安生而食,用钱如水小凶',
('天芮', '景'): '芮景:才情卓越,大智若愚小吉',
('天芮', '死'): '芮死:日落西山,旦不保夕大凶',
('天芮', '惊'): '芮惊:风吹草动,一夕数惊小凶',
('天芮', '开'): '芮开:堆金积玉,安富尊荣大吉',

('天冲', '休'): '冲休:履险如夷,转危为安大吉',
('天冲', '生'): '冲生:塞翁失马,安之非福大吉',
('天冲', '伤'): '冲伤:遍体鳞伤,痛入骨髓大凶',
('天冲', '杜'): '冲杜:墨守成规,不知改变小凶',
('天冲', '景'): '冲景:车载斗量,指不胜屈小吉',
('天冲', '死'): '冲死:刀光剑影,枕戈待旦小凶',
('天冲', '惊'): '冲惊:遇人不淑,劳燕分飞大凶',
('天冲', '开'): '冲开:力行不怠,一日千重大吉',

('天辅', '休'): '辅休:雾消云散,重见光明大吉',
('天辅', '生'): '辅生:心心相印,海誓山盟大吉',
('天辅', '伤'): '辅伤:先天不足,后天未补小凶',
('天辅', '杜'): '辅杜:七颠八倒,自相矛盾大凶',
('天辅', '景'): '辅景:春风一度,始乱终弃小吉',
('天辅', '死'): '辅死:花天酒地,玩物丧志小凶',
('天辅', '惊'): '辅惊:天罗地网,插翅难飞小凶',
('天辅', '开'): '辅开:字无分文,牛衣对泣小凶',

('天禽', '休'): '禽休:披枷戴锁,锒铛入狱小凶',
('天禽', '生'): '禽生:前山后海,进退两难小凶',
('天禽', '伤'): '禽伤:遍体鳞伤,痛入骨髓大凶',
('天禽', '杜'): '禽杜:七颠八倒,自相矛盾大凶',
('天禽', '景'): '禽景:春风一度,始乱终弃小凶',
('天禽', '死'): '禽死:日落西山,旦不保夕大凶',
('天禽', '惊'): '禽惊:投机取巧,惟利是图大凶',
('天禽', '开'): '禽开:四海漂泊,何处是家小凶',

('天心', '休'): '心休:官明如镜,吏清如水大吉',
('天心', '生'): '心生:六根清净,山林隐逸大吉',
('天心', '伤'): '心伤:飞来横祸,轩然大波小凶',
('天心', '杜'): '心杜:山穷水尽,千辛万苦大凶',
('天心', '景'): '心景:相见恨晚,握手言欢小吉',
('天心', '死'): '心死:生死有命,回天乏术小凶',
('天心', '惊'): '心惊:千变万化,不可捉摸小凶',
('天心', '开'): '心开:四海漂泊,何处是家小凶',

('天柱', '休'): '柱休:孤云野鹤,枕流漱石大吉',
('天柱', '生'): '柱生:怜我怜卿,鸾凤和鸣大吉',
('天柱', '伤'): '柱伤:上下其手,一手遮天大凶',
('天柱', '杜'): '柱杜:七颠八倒,自相矛盾大凶',
('天柱', '景'): '柱景:先著祖鞭,长治久安小吉',
('天柱', '死'): '柱死:引狼入室,虎视耽耽小凶',
('天柱', '惊'): '柱惊:投机取巧,惟利是图大凶',
('天柱', '开'): '柱开:有勇有谋,果决前进大吉',

('天任', '休'): '任休:因材施教,青出于蓝大吉',
('天任', '生'): '任生:前山后海,进退两难小凶',
('天任', '伤'): '任伤:饥不择食,饮鸩止渴小凶',
('天任', '杜'): '任杜:积劳成疾,病入膏肓小凶',
('天任', '景'): '任景:衣暖食饱,琼楼玉宇小吉',
('天任', '死'): '任死:明目张胆,坐地分赃大凶',
('天任', '惊'): '任惊:一无所得,人财两空小凶',
('天任', '开'): '任开:仓斗库实,有备无患大吉',

('天英', '休'): '英休:寸进尺退,一事无成小凶',
('天英', '生'): '英生:游山玩水,走遍天下大吉',
('天英', '伤'): '英伤:龙争虎斗,两败俱伤小凶',
('天英', '杜'): '英杜:倚官仗势,作威作福小凶',
('天英', '景'): '英景:春风一度,始乱终弃小凶',
('天英', '死'): '英死:连年征战,劳民伤财小凶',
('天英', '惊'): '英惊:目瞪口呆,方寸已乱小凶',
('天英', '开'): '英开:金碧辉煌,前呼后拥大吉',
}

# 八门克应
self.men_ying = {
('开', '开'): '开门加开:主贵人、宝物、财喜',
('开', '休'): '开休:主见贵人、财喜,更主开张铺店,贸易大利',
('开', '生'): '开生:主见贵人、谋望,所求皆遂',
('开', '伤'): '开伤:主变动,更改、移徙事皆不吉',
('开', '杜'): '开杜:失脱刊印书契小凶',
('开', '景'): '开景:主见贵人,因文书事不利',
('开', '死'): '开死:主官司惊忧,先忧后喜',
('开', '惊'): '开惊:主百事不利',

('休', '休'): '休门加休:求财、进人口、谒贵吉',
('休', '生'): '休生:主得阴人财物并干贵,谋望迟应吉',
('休', '伤'): '休伤:主上官喜庆,求财不得,有亲故分产变动事,不吉',
('休', '杜'): '休杜:主破财,失物难寻',
('休', '景'): '休景:主求望、文书印信事不至,反招口舌,小凶',
('休', '死'): '休死:主求文书印信、官司事,或僧道远行事,不吉',
('休', '惊'): '休惊:主损财招益,并疾病惊恐事,破财不利',
('休', '开'): '休开:主开张店肆及见贵、求财、喜庆事,大吉',

('生', '生'): '生门加生:主远行、求财产吉',
('生', '伤'): '生伤:主亲友变动道路不吉',
('生', '杜'): '生杜:主阴谋,阴人破财,不利',
('生', '景'): '生景:主阴人、小口不寍及文书事后吉',
('生', '死'): '生死:主田宅官司主难救',
('生', '惊'): '生惊:主尊长财产词讼及病缠迟愈吉',
('生', '开'): '生开:主见贵人,求财大发',
('生', '休'): '生休:主阴人处求望财利吉',

('伤', '伤'): '伤门加伤:主变动,远行皆折伤,凶',
('伤', '杜'): '伤杜:主变动、失脱、官司、桎梏,百事凶',
('伤', '景'): '伤景:主文书、印信、口舌、动挠、啾喞',
('伤', '死'): '伤死:主官司、印信,凶',
('伤', '惊'): '伤惊:主亲人疾病忧惧,谋伐不利,凶',
('伤', '开'): '伤开:主贵人,开张有走失变动之事,不利',
('伤', '休'): '伤休:主阳人变动,或托人谋干财名不利',
('伤', '生'): '伤生:主房产、种植事业,凶',

('杜', '杜'): '杜门加杜:主因父母疾病、田宅出脱事,凶',
('杜', '景'): '杜景:主文书印信阻隔,阳人、小口疾病,迟疑不利',
('杜', '死'): '杜死:主田宅;文书失落,官司破财,小凶',
('杜', '惊'): '杜惊:主门户内忧疑惊恐,并有词讼事',
('杜', '开'): '杜开:主见贵人、官长,谋事主先破己财后吉',
('杜', '休'): '杜休:主求财有益',
('杜', '生'): '杜生:主阳人小口破财,及田宅求财不成',
('杜', '伤'): '杜伤:主兄弟相争,田产破财',

('景', '景'): '景门加景:主文状未动,有预先见之意,内有阳人小口忧患',
('景', '死'): '景死:主官讼,因田宅事争,多啾唧',
('景', '惊'): '景惊:主阳人、小口疾病事,凶',
('景', '开'): '景开:主官人升迁吉,求文印更吉',
('景', '休'): '景休:主文书遗失,争讼不休',
('景', '生'): '景生:主阴人生产大喜,更主求财旺利,行人皆吉',
('景', '伤'): '景伤:主姻亲眷小口角,或嫌隙挠乱',
('景', '杜'): '景杜:主失脱文书,散财后平',

('死', '死'): '死门加死:主官司而留,印信无气,凶',
('死', '惊'): '死惊:主因官司不给,忧疑、患病,凶',
('死', '开'): '死开:主见贵人,求印信、文书事,大利',
('死', '休'): '死休:主求财物事不吉,若问僧道求方吉',
('死', '生'): '死生:主丧事,求财得',
('死', '伤'): '死伤:主官司动而被刑杖,凶',
('死', '杜'): '死杜:主破财,妇人风疾,腹肿,阻绝凶',
('死', '景'): '死景:主因文契、印信、财产事见官,先怒后喜,不凶',

('惊', '惊'): '惊门加惊:主疾病、忧虑、惊疑',
('惊', '开'): '惊开:主忧疑、官司、惊恐,又主上见喜,不凶',
('惊', '休'): '惊休:主求财事,或因口舌、求财事,迟吉',
('惊', '生'): '惊生:主因妇人生忧惊,或因求财生忧惊,皆吉',
('惊', '伤'): '惊伤:主因商议同谋害人事泄,惹讼,凶',
('惊', '杜'): '惊杜:主因失脱破财、惊恐,不凶',
('惊', '景'): '惊景:主词讼不息及小口疾病',
('惊', '死'): '惊死:主因宅中怪异而生是非,凶',
}

# 吉格列表
self.ji_ge = [
'青龙返首', '飞鸟跌穴', '青龙耀明', '青龙转光', '奇仪顺遂',
'日月并行', '三诈格', '天遁', '地遁', '人遁', '神遁', '鬼遁',
'真诈', '休诈', '重诈', '三奇得使', '玉女守门', '天辅时'
]

# 凶格列表
self.xiong_ge = [
'伏吟', '反吟', '六仪击刑', '三奇入墓', '天网四张', '悖格',
'青龙逃走', '白虎猖狂', '螣蛇夭矫', '朱雀投江', '荧入太白', '太白入荧',
'大格', '小格', '刑格', '门迫', '五不遇时'
]

# 九星基本含义
self.jiuxing_meanings = {
'天蓬': '大盗、破财、能做大事业之人,流动性强、阴险狡诈',
'天芮': '病星、病神,求学求道之人,学生学员',
'天冲': '武士、处事雷励风行,代表农事、树林、车辆',
'天辅': '文化教育,老师,漂亮,利于升学、考学',
'天禽': '方正、厚道人,代表有凝聚力的人物、领袖人物',
'天心': '医生、圆形、有心计人,利于医疗、经商',
'天柱': '凶灾、破败,惊恐怪异、破坏、毁坏',
'天任': '吉利、厚道人,诚信、稳重但偏于执拗',
'天英': '烈性、砖窑等,性躁易暴、好胜,和血光有关',
}

# 八门基本含义
self.bamen_meanings = {
'休': '公务员、机关科室人员、休闲,利于接待、婚姻、求财',
'生': '财利、利润、房地产、养殖,利于求财造屋、上官赴任',
'伤': '伤灾、疾病、跑动、车辆、竞争、博弈',
'杜': '保密、技术、警察、公安、安全部门、堵塞',
'景': '文书、合同、血光、学校、学习、信息',
'死': '死亡、地皮、坟地、凶灾、不愉快',
'惊': '口舌官司、惊恐、律师,利于斗讼官司',
'开': '开始、原始、开创、领导、法官、门面',
}

# 八神基本含义
self.bashen_meanings = {
'值符': '长者、贵人、领导、核心人物、凝聚力',
'腾蛇': '惊恐怪异、变化多端、虚诈、虚幻不实',
'太阴': '阴匿、暗昧,多与女人、阴私之事有关',
'六合': '婚姻交易、中介、合作、和合之事',
'白虎': '凶恶、杀伐、争斗、疾病、死丧、道路',
'玄武': '奸谗、盗贼、口舌、聪明多智、偷盗',
'九地': '柔顺、稳固、潜藏、屯集、播种',
'九天': '威悍、张扬、公开、扬兵布阵、飞机',
'明王': '太极、中心、伏羲人王、文王',
}

# 宫位人体对应
self.gong_body = {
1: '耳、血、肾、泌尿系统',
2: '腹、脾、胃、肌肉、右肩',
3: '足、肝、头发、左胁',
4: '肢、股、胆、左肩、气管',
5: '心、腹、脾胃',
6: '头、骨、肺、右腿',
7: '舌、口、喉、肺、右胁',
8: '手指、骨、鼻、左腿',
9: '目、心、头、眼',
}

# 宫位自然对应
self.gong_nature = {
1: '水、雨、雪、霜',
2: '地、土、田野、平地',
3: '雷、树木、闹市、竹林',
4: '风、花草、菜园',
5: '中央、太极',
6: '天、冰、雹、城市',
7: '泽、雨、新月、水际',
8: '山、云、雾、山岚',
9: '日、电、虹、霞',
}

def setup_ui(self):
input_frame = ttk.LabelFrame(self.root, text="输入时间 (支持1900-2100年)", padding=10)
input_frame.pack(fill="x", padx=10, pady=5)

ttk.Label(input_frame, text="公历年:").grid(row=0, column=0, padx=5)
self.year_var = tk.StringVar(value=str(datetime.now().year))
ttk.Entry(input_frame, textvariable=self.year_var, width=6).grid(row=0, column=1)

ttk.Label(input_frame, text="月:").grid(row=0, column=2, padx=5)
self.month_var = tk.StringVar(value=str(datetime.now().month))
ttk.Entry(input_frame, textvariable=self.month_var, width=4).grid(row=0, column=3)

ttk.Label(input_frame, text="日:").grid(row=0, column=4, padx=5)
self.day_var = tk.StringVar(value=str(datetime.now().day))
ttk.Entry(input_frame, textvariable=self.day_var, width=4).grid(row=0, column=5)

ttk.Label(input_frame, text="时:").grid(row=0, column=6, padx=5)
self.hour_var = tk.StringVar(value=str(datetime.now().hour))
ttk.Entry(input_frame, textvariable=self.hour_var, width=4).grid(row=0, column=7)

ttk.Label(input_frame, text="分:").grid(row=0, column=8, padx=5)
self.minute_var = tk.StringVar(value=str(datetime.now().minute))
ttk.Entry(input_frame, textvariable=self.minute_var, width=4).grid(row=0, column=9)

self.mode_label = ttk.Label(input_frame, text="【内置算法 – 百年精准】", foreground="green")
self.mode_label.grid(row=1, column=0, columnspan=10, pady=5)

button_frame = ttk.Frame(self.root)
button_frame.pack(fill="x", padx=10, pady=5)

ttk.Button(button_frame, text="开始排盘", command=self.calculate).pack(side="left", padx=5)
ttk.Button(button_frame, text="复制全部信息", command=self.copy_all).pack(side="left", padx=5)

# 创建一个Notebook来分页显示结果
notebook_frame = ttk.Frame(self.root)
notebook_frame.pack(fill="both", expand=True, padx=10, pady=5)

self.notebook = ttk.Notebook(notebook_frame)
self.notebook.pack(fill="both", expand=True)

# 排盘结果页
self.result_frame = ttk.Frame(self.notebook)
self.notebook.add(self.result_frame, text="排盘结果")

# 析盘内容页
self.analysis_frame = ttk.Frame(self.notebook)
self.notebook.add(self.analysis_frame, text="析盘内容")

# 断局分析页
self.judgment_frame = ttk.Frame(self.notebook)
self.notebook.add(self.judgment_frame, text="断局分析")

# 创建各个页面的文本区域
self.result_text = scrolledtext.ScrolledText(self.result_frame, wrap=tk.WORD, width=85, height=45)
self.result_text.pack(fill="both", expand=True)
self.result_text.configure(font=("宋体", 11))

self.analysis_text = scrolledtext.ScrolledText(self.analysis_frame, wrap=tk.WORD, width=85, height=45)
self.analysis_text.pack(fill="both", expand=True)
self.analysis_text.configure(font=("宋体", 11), foreground="blue")

self.judgment_text = scrolledtext.ScrolledText(self.judgment_frame, wrap=tk.WORD, width=85, height=45)
self.judgment_text.pack(fill="both", expand=True)
self.judgment_text.configure(font=("宋体", 11), foreground="darkgreen")

self.jiugong_num = {'坎': 1, '坤': 2, '震': 3, '巽': 4, '中': 5, '乾': 6, '兑': 7, '艮': 8, '离': 9}
self.num_to_jiugong = {1: '坎', 2: '坤', 3: '震', 4: '巽', 5: '中', 6: '乾', 7: '兑', 8: '艮', 9: '离'}

def tiangan_to_jiugan_converter(self, tiangan_char):
return self.tiangan_to_jiugan.get(tiangan_char, '戊')

def calculate_year_ganzhi(self, year):
remainder = (year 3) % 60
if remainder == 0:
remainder = 60
return self.jiazi_table[remainder 1]

def calculate_day_ganzhi_precise(self, year, month, day):
base_date = date(2026, 3, 7)
base_ganzhi = "庚辰"
base_index = self.jiazi_table.index(base_ganzhi)
target_date = date(year, month, day)
delta_days = (target_date base_date).days
target_index = (base_index + delta_days) % 60
return self.jiazi_table[target_index]

def _get_jieqi_by_date(self, year, month, day, hour, minute):
if year == 2026:
return self._get_jieqi_2026(month, day, hour, minute)
return self._get_jieqi_approximate(year, month, day, hour, minute)

def _get_jieqi_2026(self, month, day, hour, minute):
current_jieqi = "冬至"
for m, d, h, mi, jq in self.precise_jieqi_2026:
if (month > m) or (month == m and day > d) or \\
(month == m and day == d and hour > h) or \\
(month == m and day == d and hour == h and minute >= mi):
current_jieqi = jq
return current_jieqi

def _get_jieqi_approximate(self, year, month, day, hour, minute):
base_dates = {
'小寒': (1, 5), '大寒': (1, 20),
'立春': (2, 4), '雨水': (2, 19),
'惊蛰': (3, 5), '春分': (3, 20),
'清明': (4, 5), '谷雨': (4, 20),
'立夏': (5, 5), '小满': (5, 21),
'芒种': (6, 6), '夏至': (6, 21),
'小暑': (7, 7), '大暑': (7, 23),
'立秋': (8, 7), '处暑': (8, 23),
'白露': (9, 7), '秋分': (9, 23),
'寒露': (10, 8), '霜降': (10, 23),
'立冬': (11, 7), '小雪': (11, 22),
'大雪': (12, 7), '冬至': (12, 21)
}
year_offset = 0
if year < 2000:
year_offset = 1
elif year > 2020:
year_offset = 1
current_jieqi = "冬至"
for jq, (m, d) in base_dates.items():
adjusted_day = d + year_offset
if (month > m) or (month == m and day > adjusted_day) or \\
(month == m and day == adjusted_day and hour >= 12):
current_jieqi = jq
return current_jieqi

def get_jieqi_and_month_ganzhi(self, year, month, day, hour, minute):
current_jieqi = self._get_jieqi_by_date(year, month, day, hour, minute)
jieqi_to_dizhi = {
"立春": "寅", "雨水": "寅", "惊蛰": "卯", "春分": "卯",
"清明": "辰", "谷雨": "辰", "立夏": "巳", "小满": "巳",
"芒种": "午", "夏至": "午", "小暑": "未", "大暑": "未",
"立秋": "申", "处暑": "申", "白露": "酉", "秋分": "酉",
"寒露": "戌", "霜降": "戌", "立冬": "亥", "小雪": "亥",
"大雪": "子", "冬至": "子", "小寒": "丑", "大寒": "丑"
}
month_zhi = jieqi_to_dizhi.get(current_jieqi, "寅")
year_gan = self.calculate_year_ganzhi(year)[0]
month_gan_map = {
'甲': ['丙', '丁', '戊', '己', '庚', '辛', '壬', '癸', '甲', '乙', '丙', '丁'],
'己': ['丙', '丁', '戊', '己', '庚', '辛', '壬', '癸', '甲', '乙', '丙', '丁'],
'乙': ['戊', '己', '庚', '辛', '壬', '癸', '甲', '乙', '丙', '丁', '戊', '己'],
'庚': ['戊', '己', '庚', '辛', '壬', '癸', '甲', '乙', '丙', '丁', '戊', '己'],
'丙': ['庚', '辛', '壬', '癸', '甲', '乙', '丙', '丁', '戊', '己', '庚', '辛'],
'辛': ['庚', '辛', '壬', '癸', '甲', '乙', '丙', '丁', '戊', '己', '庚', '辛'],
'丁': ['壬', '癸', '甲', '乙', '丙', '丁', '戊', '己', '庚', '辛', '壬', '癸'],
'壬': ['壬', '癸', '甲', '乙', '丙', '丁', '戊', '己', '庚', '辛', '壬', '癸'],
'戊': ['甲', '乙', '丙', '丁', '戊', '己', '庚', '辛', '壬', '癸', '甲', '乙'],
'癸': ['甲', '乙', '丙', '丁', '戊', '己', '庚', '辛', '壬', '癸', '甲', '乙']
}
dizhi_index = self.dizhi.index(month_zhi) 2
if dizhi_index < 0:
dizhi_index += 12
month_gan = month_gan_map[year_gan][dizhi_index]
return current_jieqi, month_gan + month_zhi

def calculate_hour_ganzhi(self, day_gan, hour):
hour_gan_map = {
'甲': ['甲', '乙', '丙', '丁', '戊', '己', '庚', '辛', '壬', '癸', '甲', '乙'],
'己': ['甲', '乙', '丙', '丁', '戊', '己', '庚', '辛', '壬', '癸', '甲', '乙'],
'乙': ['丙', '丁', '戊', '己', '庚', '辛', '壬', '癸', '甲', '乙', '丙', '丁'],
'庚': ['丙', '丁', '戊', '己', '庚', '辛', '壬', '癸', '甲', '乙', '丙', '丁'],
'丙': ['戊', '己', '庚', '辛', '壬', '癸', '甲', '乙', '丙', '丁', '戊', '己'],
'辛': ['戊', '己', '庚', '辛', '壬', '癸', '甲', '乙', '丙', '丁', '戊', '己'],
'丁': ['庚', '辛', '壬', '癸', '甲', '乙', '丙', '丁', '戊', '己', '庚', '辛'],
'壬': ['庚', '辛', '壬', '癸', '甲', '乙', '丙', '丁', '戊', '己', '庚', '辛'],
'戊': ['壬', '癸', '甲', '乙', '丙', '丁', '戊', '己', '庚', '辛', '壬', '癸'],
'癸': ['壬', '癸', '甲', '乙', '丙', '丁', '戊', '己', '庚', '辛', '壬', '癸']
}
if hour >= 23 or hour < 1:
hour_index = 0
elif hour < 3:
hour_index = 1
elif hour < 5:
hour_index = 2
elif hour < 7:
hour_index = 3
elif hour < 9:
hour_index = 4
elif hour < 11:
hour_index = 5
elif hour < 13:
hour_index = 6
elif hour < 15:
hour_index = 7
elif hour < 17:
hour_index = 8
elif hour < 19:
hour_index = 9
elif hour < 21:
hour_index = 10
else:
hour_index = 11
hour_dizhi = ['子', '丑', '寅', '卯', '辰', '巳', '午', '未', '申', '酉', '戌', '亥']
hour_gan = hour_gan_map[day_gan][hour_index]
return hour_gan + hour_dizhi[hour_index]

def get_xun_shu(self, ganzhi):
tiangan = ganzhi[0]
dizhi = ganzhi[1]
jiazi_index = self.jiazi_table.index(ganzhi)
tian_index = self.tiangan.index(tiangan) + 1
di_index = self.dizhi.index(dizhi) + 1
result = di_index tian_index
if result < 0:
result += 12
xun_map = {0: 1, 10: 2, 8: 3, 6: 4, 4: 5, 2: 6}
xun_gan_map = {1: '甲子戊', 2: '甲戌己', 3: '甲申庚', 4: '甲午辛', 5: '甲辰壬', 6: '甲寅癸'}
xun_num = xun_map.get(result, 1)
return xun_num, xun_gan_map[xun_num]

def get_fu_tou(self, ganzhi):
tiangan = ganzhi[0]
dizhi = ganzhi[1]
tian_index = self.tiangan.index(tiangan) + 1
di_index = self.dizhi.index(dizhi) + 1
result = di_index tian_index
if result < 0:
result += 12
if tian_index <= 5:
jia_map = {0: '甲子', 10: '甲戌', 8: '甲申', 6: '甲午', 4: '甲辰', 2: '甲寅'}
return jia_map.get(result, '甲子')
else:
ji_map = {0: '己巳', 10: '己卯', 8: '己丑', 6: '己亥', 4: '己酉', 2: '己未'}
return ji_map.get(result, '己巳')

def get_yuan(self, futou):
dizhi = futou[1]
if dizhi in ['子', '午', '卯', '酉']:
return '上元'
elif dizhi in ['寅', '申', '巳', '亥']:
return '中元'
else:
return '下元'

def get_ju(self, jieqi, yuan):
jieqi_info = self.solar_terms.get(jieqi, {'宫': 1, '遁': '阳'})
base_ju = jieqi_info['宫']
dun = jieqi_info['遁']
if yuan == '上元':
ju = base_ju
elif yuan == '中元':
if dun == '阳':
ju = base_ju + 6
else:
ju = base_ju 6
else:
if dun == '阳':
ju = base_ju + 12
else:
ju = base_ju 12
while ju > 9:
ju -= 9
while ju < 1:
ju += 9
return ju, dun

def arrange_dipan_jiugan(self, ju, dun):
jiyi_order = ['戊', '己', '庚', '辛', '壬', '癸', '丁', '丙', '乙']
dipan = {}
if dun == '阳':
start_gong = ju
for i, gan in enumerate(jiyi_order):
gong = start_gong + i
if gong > 9:
gong -= 9
dipan[gong] = gan
else:
start_gong = ju
for i, gan in enumerate(jiyi_order):
gong = start_gong i
if gong < 1:
gong += 9
dipan[gong] = gan
return dipan

def get_zhifu_zhishi(self, dipan, xun_gan):
xun_gan_char = xun_gan[1] if len(xun_gan) >= 3 else xun_gan
xun_gong = None
for gong, gan in dipan.items():
if gan == xun_gan_char:
xun_gong = gong
break
if xun_gong is None:
xun_gong = 1
gong_to_xing_men = {
1: ('天蓬', '休'), 8: ('天任', '生'), 3: ('天冲', '伤'),
4: ('天辅', '杜'), 9: ('天英', '景'), 2: ('天芮', '死'),
7: ('天柱', '惊'), 6: ('天心', '开'), 5: ('天禽', '中')
}
return gong_to_xing_men[xun_gong]

def get_zhifu_luogong(self, dipan, shigan):
jiugan = self.tiangan_to_jiugan_converter(shigan)
for gong, gan in dipan.items():
if gan == jiugan:
return gong
return 1

def arrange_tianpan_xing(self, zhifu_xing, zhifu_luogong, dun):
"""
【核心修复】布天盘九星 – 转盘法

规则:
1. 天禽星永远固定在中5宫
2. 八星按洛书圆环顺时针顺序填入八宫
3. 九星顺序:蓬(1)→任(8)→冲(3)→辅(4)→英(9)→芮(2)→柱(7)→心(6)
4. 当值符是天禽时,实际值符星是天芮(天禽寄天芮)
"""
# 洛书圆环八宫顺时针顺序
luoshu_order = [1, 8, 3, 4, 9, 2, 7, 6]

# 九星在洛书圆环上的顺序(顺时针)
xing_order = ['天蓬', '天任', '天冲', '天辅', '天英', '天芮', '天柱', '天心']

tianpan_xing = {5: '天禽'} # 天禽固定中5宫

# 确定实际值符星
if zhifu_xing == '天禽':
actual_zhifu = '天芮' # 天禽寄天芮
else:
actual_zhifu = zhifu_xing

# 找到值符星在顺序中的位置
try:
zhifu_idx = xing_order.index(actual_zhifu)
except ValueError:
zhifu_idx = 0

# 找到直符落宫在洛书顺序中的位置
try:
start_idx = luoshu_order.index(zhifu_luogong)
except ValueError:
start_idx = 0

# 从直符落宫开始,按顺时针填入八星
for i in range(8):
xing_idx = (zhifu_idx + i) % 8
xing_name = xing_order[xing_idx]
gong = luoshu_order[(start_idx + i) % 8]
tianpan_xing[gong] = xing_name

return tianpan_xing

def arrange_tianpan_jiugan(self, dipan, tianpan_xing):
tianpan_jiyi = {}
for gong, xing_name in tianpan_xing.items():
benwei_gong = self.xing_benwei[xing_name]
tianpan_jiyi[gong] = dipan[benwei_gong]
if 5 not in tianpan_jiyi:
tianpan_jiyi[5] = dipan[5]
return tianpan_jiyi

def get_zhishi_luogong(self, zhishi_men, shigan, dun):
men_num = self.bamen_num[zhishi_men]
gan_num = self.shigan_xuhao[shigan]
if dun == '阳':
result = men_num + gan_num 1
if result > 9:
result -= 9
else:
result = men_num gan_num + 1
if result < 1:
result += 9
return result

def arrange_men(self, zhishi_men, zhishi_luogong, dun):
men_order = [1, 8, 3, 4, 9, 2, 7, 6]
bamen = {5: '中'}
if zhishi_men == '中':
for men_num in men_order:
men_name = self.num_to_bamen[men_num]
benwei = self.men_benwei[men_name]
if benwei != 5:
bamen[benwei] = men_name
return bamen
zhishi_num = self.bamen_num[zhishi_men]
try:
idx = men_order.index(zhishi_num)
except ValueError:
idx = 0
luoshu_order = [1, 8, 3, 4, 9, 2, 7, 6]
try:
gong_idx = luoshu_order.index(zhishi_luogong)
except ValueError:
gong_idx = 0
for i in range(8):
men_idx = (idx + i) % 8
men_num = men_order[men_idx]
men_name = self.num_to_bamen[men_num]
gong = luoshu_order[(gong_idx + i) % 8]
if gong != 5:
bamen[gong] = men_name
return bamen

def arrange_bashen(self, zhifu_luogong, dun):
bashen = {5: '明王'}
bashen_order = [1, 8, 3, 4, 9, 2, 7, 6]
luoshu_clockwise = [1, 8, 3, 4, 9, 2, 7, 6]
luoshu_counter = [1, 6, 7, 2, 9, 4, 3, 8]
if dun == '阳':
luoshu_order = luoshu_clockwise
else:
luoshu_order = luoshu_counter
try:
gong_idx = luoshu_order.index(zhifu_luogong)
except ValueError:
gong_idx = 0
for i in range(8):
shen_idx = i % 8
shen_num = bashen_order[shen_idx]
shen_name = self.num_to_bashen[shen_num]
gong = luoshu_order[(gong_idx + i) % 8]
if gong != 5:
bashen[gong] = shen_name
return bashen

def generate_digital_numbers(self, dipan, tianpan_jiyi, tianpan_xing, bamen, bashen):
display_order = [4, 9, 2, 3, 5, 7, 8, 1, 6]
numbers = []
for gong in display_order:
shiwan = gong
wan = self.jiugan_num[dipan[gong]]
if gong in tianpan_xing:
qian = self.jiuxing_num[tianpan_xing[gong]]
else:
qian = 5
bai = self.jiugan_num[tianpan_jiyi[gong]]
if gong in bamen:
men_name = bamen[gong]
shi = self.bamen_num[men_name]
else:
shi = 5
ge = 5
if gong in bashen:
ge = self.bashen_num[bashen[gong]]
number = f"{shiwan}{wan}{qian}{bai}{shi}{ge}"
numbers.append(number)
return numbers, display_order

# ========== 新增:析盘功能 ==========
def analyze_pan(self, dipan, tianpan_jiyi, tianpan_xing, bamen, bashen, hour_ganzhi, dun, ju):
"""分析盘中各宫格局"""
analysis_lines = []
analysis_lines.append("=" * 60)
analysis_lines.append("【析盘内容】")
analysis_lines.append("=" * 60)

# 检查各宫天盘干加地盘干的克应
analysis_lines.append("\\n一、十干克应分析")
for gong in range(1, 10):
if gong in tianpan_jiyi and gong in dipan:
tian_gan = tianpan_jiyi[gong]
di_gan = dipan[gong]
key = (tian_gan, di_gan)
if key in self.gan_ying:
analysis_lines.append(f"{gong}. {tian_gan}{di_gan}: {self.gan_ying[key]}")

# 检查三奇到宫
analysis_lines.append("\\n二、三奇到宫分析")
sanqi = ['乙', '丙', '丁']
for gong in range(1, 10):
if gong in tianpan_jiyi and tianpan_jiyi[gong] in sanqi:
key = (tianpan_jiyi[gong], gong)
if key in self.sanqi_daogong:
analysis_lines.append(f"{gong}. {self.sanqi_daogong[key]}")

# 检查星门克应
analysis_lines.append("\\n三、星门克应分析")
for gong in range(1, 10):
if gong in tianpan_xing and gong in bamen:
xing = tianpan_xing[gong]
men = bamen[gong]
key = (xing, men)
if key in self.xingmen_ying:
analysis_lines.append(f"{gong}. {self.xingmen_ying[key]}")

# 检查八门克应
analysis_lines.append("\\n四、八门克应分析")
men_list = list(bamen.keys())
for i in range(len(men_list)):
for j in range(i+1, len(men_list)):
gong1, gong2 = men_list[i], men_list[j]
men1, men2 = bamen[gong1], bamen[gong2]
key1 = (men1, men2)
key2 = (men2, men1)
if key1 in self.men_ying:
analysis_lines.append(f"{self.num_to_jiugong[gong1]}{gong1}{men1}{self.num_to_jiugong[gong2]}{gong2}{men2}: {self.men_ying[key1]}")
elif key2 in self.men_ying:
analysis_lines.append(f"{self.num_to_jiugong[gong2]}{gong2}{men2}{self.num_to_jiugong[gong1]}{gong1}{men1}: {self.men_ying[key2]}")

# 检查特殊格局
analysis_lines.append("\\n五、特殊格局分析")

# 检查伏吟
if dun == '阳':
if dipan == tianpan_jiyi:
analysis_lines.append("• 大局伏吟:天地盘相同,主静守不宜动")

# 检查反吟
for gong in range(1, 10):
if gong in tianpan_xing:
xing = tianpan_xing[gong]
benwei = self.xing_benwei.get(xing, gong)
if (gong + benwei) == 10 or (gong == 5 and benwei == 5):
analysis_lines.append(f"• {gong}宫九星反吟:{xing}星落对宫")

# 检查六仪击刑
jixing = {
(3, '戊'): '戊落震宫为子卯相刑,六仪击刑',
(2, '己'): '己落坤宫为戌未相刑,六仪击刑',
(8, '庚'): '庚落艮宫为寅申相刑,六仪击刑',
(9, '辛'): '辛落离宫为午午自刑,六仪击刑',
(4, '壬'): '壬落巽宫为辰辰自刑,六仪击刑',
(4, '癸'): '癸落巽宫为寅巳相刑,六仪击刑',
}
for gong in range(1, 10):
if gong in tianpan_jiyi:
gan = tianpan_jiyi[gong]
if (gong, gan) in jixing:
analysis_lines.append(f"• {gong}{jixing[(gong, gan)]}")

# 检查入墓
rumu = {
('乙', 2): '乙落坤宫为入墓',
('丙', 6): '丙落乾宫为入墓',
('丁', 8): '丁落艮宫为入墓',
('戊', 6): '戊落乾宫为入墓',
('己', 8): '己落艮宫为入墓',
('庚', 8): '庚落艮宫为入墓',
('辛', 4): '辛落巽宫为入墓',
('壬', 4): '壬落巽宫为入墓',
('癸', 2): '癸落坤宫为入墓',
}
for gong in range(1, 10):
if gong in tianpan_jiyi:
gan = tianpan_jiyi[gong]
if (gan, gong) in rumu:
analysis_lines.append(f"• {gong}{rumu[(gan, gong)]}")

# 检查五不遇时
analysis_lines.append("\\n六、用神分析")
# 这里可以添加更多用神分析

return "\\n".join(analysis_lines)

# ========== 新增:断局功能 ==========
def judge_pan(self, dipan, tianpan_jiyi, tianpan_xing, bamen, bashen, hour_ganzhi, dun, ju, jieqi, year_ganzhi, month_ganzhi, day_ganzhi):
"""综合判断全局吉凶"""
judgment_lines = []
judgment_lines.append("=" * 60)
judgment_lines.append("【断局分析】")
judgment_lines.append("=" * 60)

# 整体运势分析
judgment_lines.append("\\n综合本局干支格局与星门神仪组合,整体呈现如下态势:\\n")

# 分析大局伏吟反吟
is_fuyin = False
is_fanyin = False
if dun == '阳':
if dipan == tianpan_jiyi:
is_fuyin = True
judgment_lines.append("• 大局伏吟,主静守、收敛,宜守不宜攻,求财宜缓,谋事需待时机。")

for gong in range(1, 10):
if gong in tianpan_xing:
xing = tianpan_xing[gong]
benwei = self.xing_benwei.get(xing, gong)
if (gong + benwei) == 10:
is_fanyin = True
judgment_lines.append(f"• 九星反吟,主事态反复、去而复返,变动较快,易有始无终。")
break

if not is_fuyin and not is_fanyin:
judgment_lines.append("• 大局平稳,无伏吟反吟,事态发展较为平顺,可按计划推进。")

# 分析时干
shi_gan = hour_ganzhi[0]
shi_zhi = hour_ganzhi[1]
shi_jiugan = self.tiangan_to_jiugan_converter(shi_gan)

# 分析日干
ri_gan = day_ganzhi[0]

judgment_lines.append(f"\\n• 时干为{shi_gan},对应九干为{shi_jiugan},主当前所问之事的状态。")

# 分析吉凶格
judgment_lines.append("\\n一、主要吉凶格局")

# 找青龙返首、飞鸟跌穴等吉格
for gong in range(1, 10):
if gong in tianpan_jiyi and gong in dipan:
tian = tianpan_jiyi[gong]
di = dipan[gong]
if tian == '戊' and di == '丙':
judgment_lines.append(f"• {gong}宫青龙返首格:大吉之格,百事皆宜,谋为顺利。")
elif tian == '丙' and di == '戊':
judgment_lines.append(f"• {gong}宫飞鸟跌穴格:大吉之格,谋为百事洞澈,求财得利。")
elif tian == '丁' and di == '乙':
judgment_lines.append(f"• {gong}宫人遁格:利于密谋策划,求官求名皆吉。")
elif tian == '丙' and di == '丁':
judgment_lines.append(f"• {gong}宫天遁格:宜行兵、献策,百事生旺。")

# 找凶格
for gong in range(1, 10):
if gong in tianpan_jiyi and gong in dipan:
tian = tianpan_jiyi[gong]
di = dipan[gong]
if tian == '乙' and di == '辛':
judgment_lines.append(f"• {gong}宫青龙逃走格:主客皆伤,百事不利,宜退守。")
elif tian == '辛' and di == '乙':
judgment_lines.append(f"• {gong}宫白虎猖狂格:家败人亡,百事凶,远行多殃。")
elif tian == '癸' and di == '丁':
judgment_lines.append(f"• {gong}宫螣蛇夭矫格:官非口舌,百事皆凶,文书官司。")
elif tian == '丁' and di == '癸':
judgment_lines.append(f"• {gong}宫朱雀投江格:惊恐怪异,口舌官非,音信沉溺。")
elif tian == '丙' and di == '庚':
judgment_lines.append(f"• {gong}宫荧入太白格:门户破败,盗贼耗失,宜回避。")
elif tian == '庚' and di == '丙':
judgment_lines.append(f"• {gong}宫太白入荧格:占贼必来,为客进利,为主破财。")

# 星门分析
judgment_lines.append("\\n二、星门神仪分析")
for gong in range(1, 10):
if gong in tianpan_xing and gong in bamen and gong in bashen:
xing = tianpan_xing[gong]
men = bamen[gong]
shen = bashen[gong]
xing_mean = self.jiuxing_meanings.get(xing, "")
men_mean = self.bamen_meanings.get(men, "")
shen_mean = self.bashen_meanings.get(shen, "")
judgment_lines.append(f"• {gong}宫:{xing}{xing_mean}{men}{men_mean}{shen}{shen_mean}")

# 宫位象意
judgment_lines.append("\\n三、宫位象意提示")
for gong in range(1, 10):
if gong in tianpan_jiyi:
gong_name = self.num_to_jiugong[gong]
tian = tianpan_jiyi[gong]
body = self.gong_body.get(gong, "")
nature = self.gong_nature.get(gong, "")
judgment_lines.append(f"• {gong_name}{gong}宫:天盘{tian},主{body},象{nature}。")

# 综合建议
judgment_lines.append("\\n四、综合建议")

# 根据遁局给出建议
if dun == '阳':
judgment_lines.append("• 阳遁主气上升、向外,利于主动出击、积极进取。")
else:
judgment_lines.append("• 阴遁主气下降、向内,利于保守、积蓄、静观其变。")

# 根据节气给出建议
judgment_lines.append(f"• 当前节气{jieqi},宜顺应时节,把握时机。")

# 根据日干时干给出建议
judgment_lines.append(f"• 日干{ri_gan}为自身,时干{shi_gan}为事体,日时关系反映事态发展。")

# 五行平衡建议
gans = list(tianpan_jiyi.values())
wuxing_count = {'木': 0, '火': 0, '土': 0, '金': 0, '水': 0}
gan_wuxing = {'乙': '木', '丙': '火', '丁': '火', '戊': '土', '己': '土', '庚': '金', '辛': '金', '壬': '水', '癸': '水'}
for gan in gans:
if gan in gan_wuxing:
wuxing_count[gan_wuxing[gan]] += 1

judgment_lines.append(f"• 五行分布:木{wuxing_count['木']},火{wuxing_count['火']},土{wuxing_count['土']},金{wuxing_count['金']},水{wuxing_count['水']}")

max_wuxing = max(wuxing_count, key=wuxing_count.get)
min_wuxing = min(wuxing_count, key=wuxing_count.get)
judgment_lines.append(f"• 旺者为{max_wuxing},衰者为{min_wuxing},宜补{min_wuxing}之气,抑{max_wuxing}之势。")

# 安全提示
judgment_lines.append("\\n五、安全提示")
judgment_lines.append("• 结合本局象意,对晚辈、孩童的日常出行需多添留意,尤其在风雨天气、临水区域或骑行活动中,应注重安全防护,规避意外。")
judgment_lines.append("• 成人则需注意出行途中的天气变化,谨防受风、涉水相关的小麻烦。")

return "\\n".join(judgment_lines)

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())
if not (1900 <= year <= 2100):
raise ValueError("年份超出支持范围(1900-2100年)")

year_ganzhi = self.calculate_year_ganzhi(year)
jieqi, month_ganzhi = self.get_jieqi_and_month_ganzhi(year, month, day, hour, minute)
day_ganzhi = self.calculate_day_ganzhi_precise(year, month, day)
hour_ganzhi = self.calculate_hour_ganzhi(day_ganzhi[0], hour)

futou = self.get_fu_tou(day_ganzhi)
xun_num, xun_gan = self.get_xun_shu(hour_ganzhi)
yuan = self.get_yuan(futou)
ju, dun = self.get_ju(jieqi, yuan)

dipan = self.arrange_dipan_jiugan(ju, dun)
zhifu_xing, zhishi_men = self.get_zhifu_zhishi(dipan, xun_gan)
zhifu_luogong = self.get_zhifu_luogong(dipan, hour_ganzhi[0])

# 使用修复后的天盘九星排列函数
tianpan_xing = self.arrange_tianpan_xing(zhifu_xing, zhifu_luogong, dun)

tianpan_jiyi = self.arrange_tianpan_jiugan(dipan, tianpan_xing)
zhishi_luogong = self.get_zhishi_luogong(zhishi_men, hour_ganzhi[0], dun)
bamen = self.arrange_men(zhishi_men, zhishi_luogong, dun)
bashen = self.arrange_bashen(zhifu_luogong, dun)

digital_numbers, display_order = self.generate_digital_numbers(
dipan, tianpan_jiyi, tianpan_xing, bamen, bashen
)

# 清空所有文本区域
self.result_text.delete(1.0, tk.END)
self.analysis_text.delete(1.0, tk.END)
self.judgment_text.delete(1.0, tk.END)

# 显示排盘结果
self.display_result(
year, month, day, hour, minute,
year_ganzhi, month_ganzhi, day_ganzhi, hour_ganzhi,
jieqi, dun, yuan, ju, futou, xun_gan,
zhifu_xing, zhishi_men, zhifu_luogong, zhishi_luogong,
dipan, tianpan_jiyi, tianpan_xing, bamen, bashen,
digital_numbers, display_order
)

# 生成并显示析盘内容
analysis_content = self.analyze_pan(
dipan, tianpan_jiyi, tianpan_xing, bamen, bashen, hour_ganzhi, dun, ju
)
self.analysis_text.insert(tk.END, analysis_content)

# 生成并显示断局内容
judgment_content = self.judge_pan(
dipan, tianpan_jiyi, tianpan_xing, bamen, bashen, hour_ganzhi, dun, ju, jieqi,
year_ganzhi, month_ganzhi, day_ganzhi
)

# 添加免责声明
judgment_content += "\\n\\n" + "=" * 60 + "\\n"
judgment_content += "本软件为奇门遁甲数术研究的数字化辅助工具,所有排盘结果均基于传统术数逻辑与数理模型生成,仅供国学文化研究、学术探讨及个人娱乐参考,不等于专业测评,不代表任何价值评判,无任何现实指导意义。"

self.judgment_text.insert(tk.END, judgment_content)

# 切换到排盘结果页
self.notebook.select(0)

except Exception as e:
self.result_text.delete(1.0, tk.END)
self.result_text.insert(tk.END, f"计算错误: {str(e)}\\n")
traceback.print_exc()

def display_result(self, year, month, day, hour, minute, year_ganzhi, month_ganzhi, day_ganzhi, hour_ganzhi, jieqi,
dun, yuan, ju, futou, xun_gan, zhifu_xing, zhishi_men, zhifu_luogong, zhishi_luogong, dipan,
tianpan_jiyi, tianpan_xing, bamen, bashen, digital_numbers, display_order):
self.result_text.delete(1.0, tk.END)

result = "【内置算法 – 百年精准】\\n"
result += f"公历时间: {year}{month}{day}{hour:02d}:{minute:02d}\\n"
result += f"四柱八字: {year_ganzhi}{month_ganzhi}{day_ganzhi}{hour_ganzhi}时\\n"
result += f"节气: {jieqi} {dun}{yuan} {ju}局\\n"
result += f"符头: {futou} 旬首: {xun_gan}\\n"
result += f"直符: {zhifu_xing}{self.num_to_jiugong[zhifu_luogong]}{zhifu_luogong}宫\\n"
result += f"直使: {zhishi_men}门加{self.num_to_jiugong[zhishi_luogong]}{zhishi_luogong}宫\\n\\n"

result += f"{dun}{ju}局 九六心盘<九六灵图> ({day_ganzhi[0]}{hour_ganzhi[0]}时)\\n"
result += f"{xun_gan}为旬首。\\n"
result += f"直符:{zhifu_xing}星加{self.num_to_jiugong[zhifu_luogong]}{zhifu_luogong}宫。\\n"
result += f"直使:{zhishi_men}门加{self.num_to_jiugong[zhishi_luogong]}{zhishi_luogong}宫。\\n\\n"

rows = [
[digital_numbers[0], digital_numbers[1], digital_numbers[2]],
[digital_numbers[3], digital_numbers[4], digital_numbers[5]],
[digital_numbers[6], digital_numbers[7], digital_numbers[8]]
]

for row in rows:
result += f"[ {row[0]} , {row[1]} , {row[2]} ]\\n"

result += "\\n" + "=" * 60 + "\\n\\n"
result += "【详细排盘信息】\\n"
result += "-" * 40 + "\\n"

for gong in range(1, 10):
gong_name = self.num_to_jiugong[gong]
result += f"{gong_name}{gong}宫: "
result += f"地盘{dipan[gong]} | 天盘{tianpan_jiyi[gong]} | "
if gong in tianpan_xing:
result += f"星{tianpan_xing[gong]} | "
else:
result += f"星天禽 | "
if gong in bamen:
result += f"门{bamen[gong]} | "
else:
result += f"门中 | "
if gong in bashen:
result += f"神{bashen[gong]}\\n"
else:
result += f"神-\\n"

result += "\\n" + "=" * 60 + "\\n\\n"
result += "【数字盘说明】\\n"
result += "六位数字含义: (十万位-万位-千位-百位-十位-个位)\\n"
result += "十万位: 地盘九宫 (1坎,2坤,3震,4巽,5中,6乾,7兑,8艮,9离)\\n"
result += "万位: 地盘九干 (1戊,2己,3庚,4辛,5壬,6癸,7丁,8丙,9乙)\\n"
result += "千位: 天盘九星 (1蓬,2芮,3冲,4辅,5禽,6心,7柱,8任,9英)\\n"
result += "百位: 天盘九干 (1戊,2己,3庚,4辛,5壬,6癸,7丁,8丙,9乙)\\n"
result += "十位: 人盘九门 (1休,2死,3伤,4杜,5中,6开,7惊,8生,9景)\\n"
result += "个位: 神盘九神 (1值符,8腾蛇,3太阴,4六合,5明王,9白虎,2玄武,7九地,6九天)\\n\\n"

gong_names = ['巽4', '离9', '坤2', '震3', '中5', '兑7', '艮8', '坎1', '乾6']
for i, (num, gong_name) in enumerate(zip(digital_numbers, gong_names)):
gong = display_order[i]
ge_value = self.bashen_num[bashen[gong]]
ge_name = bashen[gong]
result += f"{gong_name}宫: {num} = "
result += f"{gong}({self.num_to_jiugong[gong]})/{dipan[gong]}({self.jiugan_num[dipan[gong]]})/"
if gong in tianpan_xing:
result += f"{tianpan_xing[gong]}({self.jiuxing_num[tianpan_xing[gong]]})/"
else:
result += f"天禽(5)/"
result += f"{tianpan_jiyi[gong]}({self.jiugan_num[tianpan_jiyi[gong]]})/"
if gong in bamen:
result += f"{bamen[gong]}({self.bamen_num[bamen[gong]]})/"
else:
result += f"中(5)/"
result += f"{ge_name}({ge_value})\\n"

result += "\\n" + "=" * 60 + "\\n"
result += "注:请点击上方'析盘内容'和'断局分析'标签查看详细解析\\n"

self.result_text.insert(tk.END, result)

def copy_all(self):
"""复制所有内容"""
all_content = []
all_content.append(self.result_text.get(1.0, tk.END))
all_content.append("\\n\\n" + self.analysis_text.get(1.0, tk.END))
all_content.append("\\n\\n" + self.judgment_text.get(1.0, tk.END))

content = "".join(all_content)
self.root.clipboard_clear()
self.root.clipboard_append(content)
old_title = self.root.title()
self.root.title("已复制到剪贴板!")
self.root.after(2000, lambda: self.root.title(old_title))

def main():
root = tk.Tk()
app = DigitalQiMenDunJia(root)
root.mainloop()

if __name__ == "__main__":
main()

赞(0)
未经允许不得转载:171主机测评 » python语言数字奇门遁甲标准版 - 时家奇门转盘拆补法 v3.8 (完整版带析盘断局)代码QZQ
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址