Spaces:
Runtime error
Runtime error
import gradio as gr | |
from datetime import datetime | |
import sxtwl | |
import collections | |
class BaZi: | |
def __init__(self): | |
self.Gan = ["甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"] | |
self.Zhi = ["子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"] | |
self.hidden_gan = { | |
"子": ["癸"], | |
"丑": ["己", "癸", "辛"], | |
"寅": ["甲", "丙", "戊"], | |
"卯": ["乙"], | |
"辰": ["戊", "乙", "癸"], | |
"巳": ["丙", "庚", "戊"], | |
"午": ["丁", "己"], | |
"未": ["己", "丁", "乙"], | |
"申": ["庚", "壬", "戊"], | |
"酉": ["辛"], | |
"戌": ["戊", "辛", "丁"], | |
"亥": ["壬", "甲"] | |
} | |
self.five_elements = { | |
"甲": "木", "乙": "木", | |
"丙": "火", "丁": "火", | |
"戊": "土", "己": "土", | |
"庚": "金", "辛": "金", | |
"壬": "水", "癸": "水" | |
} | |
self.ten_gods = { | |
("甲", "甲"): "比肩", ("甲", "乙"): "劫財", | |
("甲", "丙"): "食神", ("甲", "丁"): "傷官", | |
("甲", "戊"): "偏財", ("甲", "己"): "正財", | |
("甲", "庚"): "七殺", ("甲", "辛"): "正官", | |
("甲", "壬"): "偏印", ("甲", "癸"): "正印", | |
} | |
self.season_relations = { | |
"春": {"木": "旺", "火": "相", "土": "死", "金": "囚", "水": "休"}, | |
"夏": {"火": "旺", "土": "相", "金": "死", "水": "囚", "木": "休"}, | |
"秋": {"金": "旺", "水": "相", "木": "死", "火": "囚", "土": "休"}, | |
"冬": {"水": "旺", "木": "相", "火": "死", "土": "囚", "金": "休"} | |
} | |
def get_season(self, month): | |
if month in [2, 3, 4]: | |
return "春" | |
elif month in [5, 6, 7]: | |
return "夏" | |
elif month in [8, 9, 10]: | |
return "秋" | |
else: | |
return "冬" | |
def get_bazi(self, year, month, day, hour): | |
day_obj = sxtwl.fromSolar(year, month, day) | |
year_gz = day_obj.getYearGZ() | |
month_gz = day_obj.getMonthGZ() | |
day_gz = day_obj.getDayGZ() | |
year_gan = self.Gan[year_gz.tg] | |
year_zhi = self.Zhi[year_gz.dz] | |
month_gan = self.Gan[month_gz.tg] | |
month_zhi = self.Zhi[month_gz.dz] | |
day_gan = self.Gan[day_gz.tg] | |
day_zhi = self.Zhi[day_gz.dz] | |
hour_gan_idx = (day_gz.tg % 5) * 2 + hour // 2 % 10 | |
hour_zhi_idx = hour // 2 % 12 | |
hour_gan = self.Gan[hour_gan_idx] | |
hour_zhi = self.Zhi[hour_zhi_idx] | |
return { | |
"year": (year_gan, year_zhi), | |
"month": (month_gan, month_zhi), | |
"day": (day_gan, day_zhi), | |
"hour": (hour_gan, hour_zhi) | |
} | |
def get_ten_gods(self, day_gan, other_gan): | |
base_relations = self.ten_gods[("甲", other_gan)] | |
day_index = self.Gan.index(day_gan) | |
if day_index % 2 == 0: # 陽干 | |
return base_relations | |
else: # 陰干 | |
if "正" in base_relations: | |
return base_relations.replace("正", "偏") | |
elif "偏" in base_relations: | |
return base_relations.replace("偏", "正") | |
return base_relations | |
def analyze_life_structure(self, bazi, birth_year, birth_month): | |
result = [] | |
day_master = bazi["day"][0] | |
season = self.get_season(birth_month) | |
# 分析日主強弱 | |
day_master_element = self.five_elements[day_master] | |
day_master_status = self.season_relations[season][day_master_element] | |
result.append(f"\n命主五行: {day_master_element}") | |
result.append(f"命主生旺狀態: {day_master_status}") | |
# 分析十神 | |
result.append("\n十神分析:") | |
for pillar_name, (gan, zhi) in bazi.items(): | |
god = self.get_ten_gods(day_master, gan) | |
result.append(f"{pillar_name}柱天干為 {god}") | |
# 地支藏干 | |
result.append(f"{pillar_name}柱地支藏干:") | |
for hidden in self.hidden_gan[zhi]: | |
hidden_god = self.get_ten_gods(day_master, hidden) | |
result.append(f" - {hidden}: {hidden_god}") | |
# 分析格局 | |
elements = self.analyze_five_elements(bazi) | |
strongest_element = max(elements.items(), key=lambda x: x[1])[0] | |
weakest_element = min(elements.items(), key=lambda x: x[1])[0] | |
result.append("\n五行格局:") | |
result.append(f"最旺五行: {strongest_element} ({elements[strongest_element]})") | |
result.append(f"最弱五行: {weakest_element} ({elements[weakest_element]})") | |
# 人生階段預測 | |
result.append("\n人生階段預測:") | |
result.extend(self.analyze_life_stages(bazi, day_master_element, day_master_status)) | |
return result | |
def analyze_life_stages(self, bazi, day_master_element, day_master_status): | |
stages = [] | |
# 童年運勢 (0-10歲) | |
stages.append("\n童年期 (0-10歲):") | |
if day_master_status in ["旺", "相"]: | |
stages.append("命主旺相,童年較為順遂,家庭環境較好") | |
else: | |
stages.append("命主偏弱,童年可能面臨一些挑戰") | |
# 青年運勢 (11-30歲) | |
stages.append("\n青年期 (11-30歲):") | |
stages.extend(self.analyze_career_and_relationships(bazi)) | |
# 中年運勢 (31-50歲) | |
stages.append("\n中年期 (31-50歲):") | |
stages.extend(self.analyze_middle_age(bazi)) | |
# 晚年運勢 (51歲以後) | |
stages.append("\n晚年期 (51歲以後):") | |
stages.extend(self.analyze_later_life(bazi)) | |
return stages | |
def analyze_career_and_relationships(self, bazi): | |
result = [] | |
day_master = bazi["day"][0] | |
# 事業分析 | |
career_element = self.five_elements[bazi["month"][0]] | |
if self.is_generating(career_element, self.five_elements[day_master]): | |
result.append("事業發展順利,有貴人相助") | |
elif self.is_controlling(career_element, self.five_elements[day_master]): | |
result.append("事業發展需要克服挑戰,但磨練後會有所成就") | |
# 感情分析 | |
relationship_element = self.five_elements[bazi["hour"][0]] | |
if self.is_generating(relationship_element, self.five_elements[day_master]): | |
result.append("感情運勢較好,容易遇到良緣") | |
elif self.is_controlling(relationship_element, self.five_elements[day_master]): | |
result.append("感情道路可能曲折,需要用心經營") | |
return result | |
def analyze_middle_age(self, bazi): | |
result = [] | |
# 分析財運 | |
wealth_count = sum(1 for pillar in bazi.values() | |
if "財" in self.get_ten_gods(bazi["day"][0], pillar[0])) | |
if wealth_count >= 2: | |
result.append("中年財運亨通,有機會獲得較好的財務成就") | |
else: | |
result.append("中年需要穩健理財,避免投機") | |
# 分析健康 | |
health_element = self.five_elements[bazi["month"][0]] | |
if self.is_generating(health_element, self.five_elements[bazi["day"][0]]): | |
result.append("身體狀況較好,但仍需注意保養") | |
else: | |
result.append("需要特別注意健康,定期檢查和運動") | |
return result | |
def analyze_later_life(self, bazi): | |
result = [] | |
# 分析晚年生活質量 | |
life_quality_element = self.five_elements[bazi["hour"][0]] | |
if self.is_generating(life_quality_element, self.five_elements[bazi["day"][0]]): | |
result.append("晚年生活質量較好,家庭和睦") | |
else: | |
result.append("晚年需要調適心態,保持樂觀") | |
# 分析人際關係 | |
relationship_count = sum(1 for pillar in bazi.values() | |
if "印" in self.get_ten_gods(bazi["day"][0], pillar[0])) | |
if relationship_count >= 2: | |
result.append("晚年人際關係良好,得子女孝順") | |
else: | |
result.append("建議多與家人互動,維持良好的人際關係") | |
return result | |
def analyze_five_elements(self, bazi): | |
elements_count = collections.Counter() | |
for pillar in bazi.values(): | |
gan = pillar[0] | |
elements_count[self.five_elements[gan]] += 1 | |
zhi = pillar[1] | |
for hidden in self.hidden_gan[zhi]: | |
elements_count[self.five_elements[hidden]] += 0.5 | |
return elements_count | |
def get_current_luck(self, bazi, current_year, current_month, current_day): | |
result = [] | |
day_master = bazi["day"][0] | |
# 年運 | |
year_gan = self.Gan[current_year % 10] | |
year_zhi = self.Zhi[current_year % 12] | |
result.append(f"\n{current_year}年運勢:") | |
result.append(f"流年干支: {year_gan}{year_zhi}") | |
year_god = self.get_ten_gods(day_master, year_gan) | |
result.append(f"流年天干: {year_god}") | |
if self.five_elements[year_gan] == self.five_elements[day_master]: | |
result.append("今年與日主相合,運勢平穩,適合維持現狀") | |
elif self.is_generating(self.five_elements[year_gan], self.five_elements[day_master]): | |
result.append("今年五行生助日主,運勢較好,可以主動發展") | |
elif self.is_controlling(self.five_elements[year_gan], self.five_elements[day_master]): | |
result.append("今年五行剋制日主,需要謹慎行事,避免衝動") | |
# 月運 | |
month_gan = self.Gan[current_month % 10] | |
month_zhi = self.Zhi[current_month % 12] | |
result.append(f"\n本月運勢:") | |
result.append(f"流月干支: {month_gan}{month_zhi}") | |
month_god = self.get_ten_gods(day_master, month_gan) | |
result.append(f"流月天干: {month_god}") | |
# 日運 | |
day_gan = self.Gan[current_day % 10] | |
day_zhi = self.Zhi[current_day % 12] | |
result.append(f"\n今日運勢:") | |
result.append(f"流日干支: {day_gan}{day_zhi}") | |
day_god = self.get_ten_gods(day_master, day_gan) | |
result.append(f"流日天干: {day_god}") | |
return result | |
def is_generating(self, element1, element2): | |
generating_cycles = { | |
"木": "火", | |
"火": "土", | |
"土": "金", | |
"金": "水", | |
"水": "木" | |
} | |
return generating_cycles[element1] == element2 | |
def is_controlling(self, element1, element2): | |
controlling_cycles = { | |
"木": "土", | |
"土": "水", | |
"水": "火", | |
"火": "金", | |
"金": "木" | |
} | |
return controlling_cycles[element1] == element2 | |
def analyze_bazi(year, month, day, hour): | |
bazi = BaZi() | |
try: | |
# 計算八字 | |
birth_bazi = bazi.get_bazi(year, month, day, hour) | |
# 組織輸出結果 | |
result = ["您的八字:"] | |
result.append(f"年柱:{birth_bazi['year'][0]}{birth_bazi['year'][1]}") | |
result.append(f"月柱:{birth_bazi['month'][0]}{birth_bazi['month'][1]}") | |
result.append(f"日柱:{birth_bazi['day'][0]}{birth_bazi['day'][1]}") | |
result.append(f"時柱:{birth_bazi['hour'][0]}{birth_bazi['hour'][1]}") | |
# 命盤分析 | |
result.append("\n命盤分析:") | |
life_analysis = bazi.analyze_life_structure(birth_bazi, year, month) | |
result.extend(life_analysis) | |
# 當前運勢 | |
current_date = datetime.now() | |
current_luck = bazi.get_current_luck(birth_bazi, | |
current_date.year, | |
current_date.month, | |
current_date.day) | |
result.append("\n當前運勢:") | |
result.extend(current_luck) | |
return "\n".join(result) | |
except Exception as e: | |
return f"發生錯誤:{str(e)}" | |
# 創建Gradio界面 | |
def create_interface(): | |
with gr.Blocks(title="八字分析系統", theme=gr.themes.Soft()) as app: | |
gr.Markdown(""" | |
# 八字命盤分析系統 | |
請輸入您的出生年月日時,獲取詳細的八字分析。 | |
""") | |
with gr.Row(): | |
with gr.Column(): | |
year_input = gr.Number(label="出生年份", value=1990, minimum=1900, maximum=2100) | |
month_input = gr.Number(label="出生月份", value=1, minimum=1, maximum=12) | |
day_input = gr.Number(label="出生日期", value=1, minimum=1, maximum=31) | |
hour_input = gr.Number(label="出生時辰(24小時制)", value=0, minimum=0, maximum=23) | |
submit_btn = gr.Button("分析八字", variant="primary") | |
with gr.Column(): | |
output = gr.Textbox(label="分析結果", lines=20) | |
submit_btn.click( | |
fn=analyze_bazi, | |
inputs=[year_input, month_input, day_input, hour_input], | |
outputs=output | |
) | |
gr.Markdown(""" | |
### 使用說明 | |
1. 請輸入完整的出生年月日時(24小時制) | |
2. 年份請輸入公曆年份(如1990) | |
3. 時辰請使用24小時制(0-23) | |
4. 點擊"分析八字"按鈕獲取結果 | |
### 分析內容包括 | |
- 完整八字 | |
- 命盤結構分析 | |
- 五行生剋關係 | |
- 人生階段預測 | |
- 當前運勢分析 | |
""") | |
return app | |
# 啟動應用 | |
if __name__ == "__main__": | |
app = create_interface() | |
app.launch() | |