Numerology / app.py
lovelyai999's picture
Create app.py
4512222 verified
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()