Spaces:
Runtime error
Runtime error
Create app.py
Browse files
app.py
ADDED
@@ -0,0 +1,375 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import gradio as gr
|
2 |
+
from datetime import datetime
|
3 |
+
import sxtwl
|
4 |
+
import collections
|
5 |
+
|
6 |
+
class BaZi:
|
7 |
+
def __init__(self):
|
8 |
+
self.Gan = ["甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"]
|
9 |
+
self.Zhi = ["子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"]
|
10 |
+
self.hidden_gan = {
|
11 |
+
"子": ["癸"],
|
12 |
+
"丑": ["己", "癸", "辛"],
|
13 |
+
"寅": ["甲", "丙", "戊"],
|
14 |
+
"卯": ["乙"],
|
15 |
+
"辰": ["戊", "乙", "癸"],
|
16 |
+
"巳": ["丙", "庚", "戊"],
|
17 |
+
"午": ["丁", "己"],
|
18 |
+
"未": ["己", "丁", "乙"],
|
19 |
+
"申": ["庚", "壬", "戊"],
|
20 |
+
"酉": ["辛"],
|
21 |
+
"戌": ["戊", "辛", "丁"],
|
22 |
+
"亥": ["壬", "甲"]
|
23 |
+
}
|
24 |
+
self.five_elements = {
|
25 |
+
"甲": "木", "乙": "木",
|
26 |
+
"丙": "火", "丁": "火",
|
27 |
+
"戊": "土", "己": "土",
|
28 |
+
"庚": "金", "辛": "金",
|
29 |
+
"壬": "水", "癸": "水"
|
30 |
+
}
|
31 |
+
self.ten_gods = {
|
32 |
+
("甲", "甲"): "比肩", ("甲", "乙"): "劫財",
|
33 |
+
("甲", "丙"): "食神", ("甲", "丁"): "傷官",
|
34 |
+
("甲", "戊"): "偏財", ("甲", "己"): "正財",
|
35 |
+
("甲", "庚"): "七殺", ("甲", "辛"): "正官",
|
36 |
+
("甲", "壬"): "偏印", ("甲", "癸"): "正印",
|
37 |
+
}
|
38 |
+
|
39 |
+
self.season_relations = {
|
40 |
+
"春": {"木": "旺", "火": "相", "土": "死", "金": "囚", "水": "休"},
|
41 |
+
"夏": {"火": "旺", "土": "相", "金": "死", "水": "囚", "木": "休"},
|
42 |
+
"秋": {"金": "旺", "水": "相", "木": "死", "火": "囚", "土": "休"},
|
43 |
+
"冬": {"水": "旺", "木": "相", "火": "死", "土": "囚", "金": "休"}
|
44 |
+
}
|
45 |
+
|
46 |
+
def get_season(self, month):
|
47 |
+
if month in [2, 3, 4]:
|
48 |
+
return "春"
|
49 |
+
elif month in [5, 6, 7]:
|
50 |
+
return "夏"
|
51 |
+
elif month in [8, 9, 10]:
|
52 |
+
return "秋"
|
53 |
+
else:
|
54 |
+
return "冬"
|
55 |
+
|
56 |
+
def get_bazi(self, year, month, day, hour):
|
57 |
+
day_obj = sxtwl.fromSolar(year, month, day)
|
58 |
+
|
59 |
+
year_gz = day_obj.getYearGZ()
|
60 |
+
month_gz = day_obj.getMonthGZ()
|
61 |
+
day_gz = day_obj.getDayGZ()
|
62 |
+
|
63 |
+
year_gan = self.Gan[year_gz.tg]
|
64 |
+
year_zhi = self.Zhi[year_gz.dz]
|
65 |
+
month_gan = self.Gan[month_gz.tg]
|
66 |
+
month_zhi = self.Zhi[month_gz.dz]
|
67 |
+
day_gan = self.Gan[day_gz.tg]
|
68 |
+
day_zhi = self.Zhi[day_gz.dz]
|
69 |
+
|
70 |
+
hour_gan_idx = (day_gz.tg % 5) * 2 + hour // 2 % 10
|
71 |
+
hour_zhi_idx = hour // 2 % 12
|
72 |
+
hour_gan = self.Gan[hour_gan_idx]
|
73 |
+
hour_zhi = self.Zhi[hour_zhi_idx]
|
74 |
+
|
75 |
+
return {
|
76 |
+
"year": (year_gan, year_zhi),
|
77 |
+
"month": (month_gan, month_zhi),
|
78 |
+
"day": (day_gan, day_zhi),
|
79 |
+
"hour": (hour_gan, hour_zhi)
|
80 |
+
}
|
81 |
+
|
82 |
+
def get_ten_gods(self, day_gan, other_gan):
|
83 |
+
base_relations = self.ten_gods[("甲", other_gan)]
|
84 |
+
day_index = self.Gan.index(day_gan)
|
85 |
+
|
86 |
+
if day_index % 2 == 0: # 陽干
|
87 |
+
return base_relations
|
88 |
+
else: # 陰干
|
89 |
+
if "正" in base_relations:
|
90 |
+
return base_relations.replace("正", "偏")
|
91 |
+
elif "偏" in base_relations:
|
92 |
+
return base_relations.replace("偏", "正")
|
93 |
+
return base_relations
|
94 |
+
|
95 |
+
def analyze_life_structure(self, bazi, birth_year, birth_month):
|
96 |
+
result = []
|
97 |
+
day_master = bazi["day"][0]
|
98 |
+
season = self.get_season(birth_month)
|
99 |
+
|
100 |
+
# 分析日主強弱
|
101 |
+
day_master_element = self.five_elements[day_master]
|
102 |
+
day_master_status = self.season_relations[season][day_master_element]
|
103 |
+
|
104 |
+
result.append(f"\n命主五行: {day_master_element}")
|
105 |
+
result.append(f"命主生旺狀態: {day_master_status}")
|
106 |
+
|
107 |
+
# 分析十神
|
108 |
+
result.append("\n十神分析:")
|
109 |
+
for pillar_name, (gan, zhi) in bazi.items():
|
110 |
+
god = self.get_ten_gods(day_master, gan)
|
111 |
+
result.append(f"{pillar_name}柱天干為 {god}")
|
112 |
+
|
113 |
+
# 地支藏干
|
114 |
+
result.append(f"{pillar_name}柱地支藏干:")
|
115 |
+
for hidden in self.hidden_gan[zhi]:
|
116 |
+
hidden_god = self.get_ten_gods(day_master, hidden)
|
117 |
+
result.append(f" - {hidden}: {hidden_god}")
|
118 |
+
|
119 |
+
# 分析格局
|
120 |
+
elements = self.analyze_five_elements(bazi)
|
121 |
+
strongest_element = max(elements.items(), key=lambda x: x[1])[0]
|
122 |
+
weakest_element = min(elements.items(), key=lambda x: x[1])[0]
|
123 |
+
|
124 |
+
result.append("\n五行格局:")
|
125 |
+
result.append(f"最旺五行: {strongest_element} ({elements[strongest_element]})")
|
126 |
+
result.append(f"最弱五行: {weakest_element} ({elements[weakest_element]})")
|
127 |
+
|
128 |
+
# 人生階段預測
|
129 |
+
result.append("\n人生階段預測:")
|
130 |
+
result.extend(self.analyze_life_stages(bazi, day_master_element, day_master_status))
|
131 |
+
|
132 |
+
return result
|
133 |
+
|
134 |
+
def analyze_life_stages(self, bazi, day_master_element, day_master_status):
|
135 |
+
stages = []
|
136 |
+
|
137 |
+
# 童年運勢 (0-10歲)
|
138 |
+
stages.append("\n童年期 (0-10歲):")
|
139 |
+
if day_master_status in ["旺", "相"]:
|
140 |
+
stages.append("命主旺相,童年較為順遂,家庭環境較好")
|
141 |
+
else:
|
142 |
+
stages.append("命主偏弱,童年可能面臨一些挑戰")
|
143 |
+
|
144 |
+
# 青年運勢 (11-30歲)
|
145 |
+
stages.append("\n青年期 (11-30歲):")
|
146 |
+
stages.extend(self.analyze_career_and_relationships(bazi))
|
147 |
+
|
148 |
+
# 中年運勢 (31-50歲)
|
149 |
+
stages.append("\n中年期 (31-50歲):")
|
150 |
+
stages.extend(self.analyze_middle_age(bazi))
|
151 |
+
|
152 |
+
# 晚年運勢 (51歲以後)
|
153 |
+
stages.append("\n晚年期 (51歲以後):")
|
154 |
+
stages.extend(self.analyze_later_life(bazi))
|
155 |
+
|
156 |
+
return stages
|
157 |
+
|
158 |
+
def analyze_career_and_relationships(self, bazi):
|
159 |
+
result = []
|
160 |
+
day_master = bazi["day"][0]
|
161 |
+
|
162 |
+
# 事業分析
|
163 |
+
career_element = self.five_elements[bazi["month"][0]]
|
164 |
+
if self.is_generating(career_element, self.five_elements[day_master]):
|
165 |
+
result.append("事業發展順利,有貴人相助")
|
166 |
+
elif self.is_controlling(career_element, self.five_elements[day_master]):
|
167 |
+
result.append("事業發展需要克服挑戰,但磨練後會有所成就")
|
168 |
+
|
169 |
+
# 感情分析
|
170 |
+
relationship_element = self.five_elements[bazi["hour"][0]]
|
171 |
+
if self.is_generating(relationship_element, self.five_elements[day_master]):
|
172 |
+
result.append("感情運勢較好,容易遇到良緣")
|
173 |
+
elif self.is_controlling(relationship_element, self.five_elements[day_master]):
|
174 |
+
result.append("感情道路可能曲折,需要用心經營")
|
175 |
+
|
176 |
+
return result
|
177 |
+
|
178 |
+
def analyze_middle_age(self, bazi):
|
179 |
+
result = []
|
180 |
+
|
181 |
+
# 分析財運
|
182 |
+
wealth_count = sum(1 for pillar in bazi.values()
|
183 |
+
if "財" in self.get_ten_gods(bazi["day"][0], pillar[0]))
|
184 |
+
|
185 |
+
if wealth_count >= 2:
|
186 |
+
result.append("中年財運亨通,有機會獲得較好的財務成就")
|
187 |
+
else:
|
188 |
+
result.append("中年需要穩健理財,避免投機")
|
189 |
+
|
190 |
+
# 分析健康
|
191 |
+
health_element = self.five_elements[bazi["month"][0]]
|
192 |
+
if self.is_generating(health_element, self.five_elements[bazi["day"][0]]):
|
193 |
+
result.append("身體狀況較好,但仍需注意保養")
|
194 |
+
else:
|
195 |
+
result.append("需要特別注意健康,定期檢查和運動")
|
196 |
+
|
197 |
+
return result
|
198 |
+
|
199 |
+
def analyze_later_life(self, bazi):
|
200 |
+
result = []
|
201 |
+
|
202 |
+
# 分析晚年生活質量
|
203 |
+
life_quality_element = self.five_elements[bazi["hour"][0]]
|
204 |
+
if self.is_generating(life_quality_element, self.five_elements[bazi["day"][0]]):
|
205 |
+
result.append("晚年生活質量較好,家庭和睦")
|
206 |
+
else:
|
207 |
+
result.append("晚年需要調適心態,保持樂觀")
|
208 |
+
|
209 |
+
# 分析人際關係
|
210 |
+
relationship_count = sum(1 for pillar in bazi.values()
|
211 |
+
if "印" in self.get_ten_gods(bazi["day"][0], pillar[0]))
|
212 |
+
|
213 |
+
if relationship_count >= 2:
|
214 |
+
result.append("晚年人際關係良好,得子女孝順")
|
215 |
+
else:
|
216 |
+
result.append("建議多與家人互動,維持良好的人際關係")
|
217 |
+
|
218 |
+
return result
|
219 |
+
|
220 |
+
def analyze_five_elements(self, bazi):
|
221 |
+
elements_count = collections.Counter()
|
222 |
+
|
223 |
+
for pillar in bazi.values():
|
224 |
+
gan = pillar[0]
|
225 |
+
elements_count[self.five_elements[gan]] += 1
|
226 |
+
|
227 |
+
zhi = pillar[1]
|
228 |
+
for hidden in self.hidden_gan[zhi]:
|
229 |
+
elements_count[self.five_elements[hidden]] += 0.5
|
230 |
+
|
231 |
+
return elements_count
|
232 |
+
|
233 |
+
def get_current_luck(self, bazi, current_year, current_month, current_day):
|
234 |
+
result = []
|
235 |
+
day_master = bazi["day"][0]
|
236 |
+
|
237 |
+
# 年運
|
238 |
+
year_gan = self.Gan[current_year % 10]
|
239 |
+
year_zhi = self.Zhi[current_year % 12]
|
240 |
+
|
241 |
+
result.append(f"\n{current_year}年運勢:")
|
242 |
+
result.append(f"流年干支: {year_gan}{year_zhi}")
|
243 |
+
|
244 |
+
year_god = self.get_ten_gods(day_master, year_gan)
|
245 |
+
result.append(f"流年天干: {year_god}")
|
246 |
+
|
247 |
+
if self.five_elements[year_gan] == self.five_elements[day_master]:
|
248 |
+
result.append("今年與日主相合,運勢平穩,適合維持現狀")
|
249 |
+
elif self.is_generating(self.five_elements[year_gan], self.five_elements[day_master]):
|
250 |
+
result.append("今年五行生助日主,運勢較好,可以主動發展")
|
251 |
+
elif self.is_controlling(self.five_elements[year_gan], self.five_elements[day_master]):
|
252 |
+
result.append("今年五行剋制日主,需要謹慎行事,避免衝動")
|
253 |
+
|
254 |
+
# 月運
|
255 |
+
month_gan = self.Gan[current_month % 10]
|
256 |
+
month_zhi = self.Zhi[current_month % 12]
|
257 |
+
|
258 |
+
result.append(f"\n本月運勢:")
|
259 |
+
result.append(f"流月干支: {month_gan}{month_zhi}")
|
260 |
+
|
261 |
+
month_god = self.get_ten_gods(day_master, month_gan)
|
262 |
+
result.append(f"流月天干: {month_god}")
|
263 |
+
|
264 |
+
# 日運
|
265 |
+
day_gan = self.Gan[current_day % 10]
|
266 |
+
day_zhi = self.Zhi[current_day % 12]
|
267 |
+
|
268 |
+
result.append(f"\n今日運勢:")
|
269 |
+
result.append(f"流日干支: {day_gan}{day_zhi}")
|
270 |
+
|
271 |
+
day_god = self.get_ten_gods(day_master, day_gan)
|
272 |
+
result.append(f"流日天干: {day_god}")
|
273 |
+
|
274 |
+
return result
|
275 |
+
|
276 |
+
def is_generating(self, element1, element2):
|
277 |
+
generating_cycles = {
|
278 |
+
"木": "火",
|
279 |
+
"火": "土",
|
280 |
+
"土": "金",
|
281 |
+
"金": "水",
|
282 |
+
"水": "木"
|
283 |
+
}
|
284 |
+
return generating_cycles[element1] == element2
|
285 |
+
|
286 |
+
def is_controlling(self, element1, element2):
|
287 |
+
controlling_cycles = {
|
288 |
+
"木": "土",
|
289 |
+
"土": "水",
|
290 |
+
"水": "火",
|
291 |
+
"火": "金",
|
292 |
+
"金": "木"
|
293 |
+
}
|
294 |
+
return controlling_cycles[element1] == element2
|
295 |
+
|
296 |
+
|
297 |
+
def analyze_bazi(year, month, day, hour):
|
298 |
+
bazi = BaZi()
|
299 |
+
|
300 |
+
try:
|
301 |
+
# 計算八字
|
302 |
+
birth_bazi = bazi.get_bazi(year, month, day, hour)
|
303 |
+
|
304 |
+
# 組織輸出結果
|
305 |
+
result = ["您的八字:"]
|
306 |
+
result.append(f"年柱:{birth_bazi['year'][0]}{birth_bazi['year'][1]}")
|
307 |
+
result.append(f"月柱:{birth_bazi['month'][0]}{birth_bazi['month'][1]}")
|
308 |
+
result.append(f"日柱:{birth_bazi['day'][0]}{birth_bazi['day'][1]}")
|
309 |
+
result.append(f"時柱:{birth_bazi['hour'][0]}{birth_bazi['hour'][1]}")
|
310 |
+
|
311 |
+
# 命盤分析
|
312 |
+
result.append("\n命盤分析:")
|
313 |
+
life_analysis = bazi.analyze_life_structure(birth_bazi, year, month)
|
314 |
+
result.extend(life_analysis)
|
315 |
+
|
316 |
+
# 當前運勢
|
317 |
+
current_date = datetime.now()
|
318 |
+
current_luck = bazi.get_current_luck(birth_bazi,
|
319 |
+
current_date.year,
|
320 |
+
current_date.month,
|
321 |
+
current_date.day)
|
322 |
+
result.append("\n當前運勢:")
|
323 |
+
result.extend(current_luck)
|
324 |
+
|
325 |
+
return "\n".join(result)
|
326 |
+
|
327 |
+
except Exception as e:
|
328 |
+
return f"發生錯誤:{str(e)}"
|
329 |
+
|
330 |
+
# 創建Gradio界面
|
331 |
+
def create_interface():
|
332 |
+
with gr.Blocks(title="八字分析系統", theme=gr.themes.Soft()) as app:
|
333 |
+
gr.Markdown("""
|
334 |
+
# 八字命盤分析系統
|
335 |
+
請輸入您的出生年月日時,獲取詳細的八字分析。
|
336 |
+
""")
|
337 |
+
|
338 |
+
with gr.Row():
|
339 |
+
with gr.Column():
|
340 |
+
year_input = gr.Number(label="出生年份", value=1990, minimum=1900, maximum=2100)
|
341 |
+
month_input = gr.Number(label="出生月份", value=1, minimum=1, maximum=12)
|
342 |
+
day_input = gr.Number(label="出生日期", value=1, minimum=1, maximum=31)
|
343 |
+
hour_input = gr.Number(label="出生時辰(24小時制)", value=0, minimum=0, maximum=23)
|
344 |
+
submit_btn = gr.Button("分析八字", variant="primary")
|
345 |
+
|
346 |
+
with gr.Column():
|
347 |
+
output = gr.Textbox(label="分析結果", lines=20)
|
348 |
+
|
349 |
+
submit_btn.click(
|
350 |
+
fn=analyze_bazi,
|
351 |
+
inputs=[year_input, month_input, day_input, hour_input],
|
352 |
+
outputs=output
|
353 |
+
)
|
354 |
+
|
355 |
+
gr.Markdown("""
|
356 |
+
### 使用說明
|
357 |
+
1. 請輸入完整的出生年月日時(24小時制)
|
358 |
+
2. 年份請輸入公曆年份(如1990)
|
359 |
+
3. 時辰請使用24小時制(0-23)
|
360 |
+
4. 點擊"分析八字"按鈕獲取結果
|
361 |
+
|
362 |
+
### 分析內容包括
|
363 |
+
- 完整八字
|
364 |
+
- 命盤結構分析
|
365 |
+
- 五行生剋關係
|
366 |
+
- 人生階段預測
|
367 |
+
- 當前運勢分析
|
368 |
+
""")
|
369 |
+
|
370 |
+
return app
|
371 |
+
|
372 |
+
# 啟動應用
|
373 |
+
if __name__ == "__main__":
|
374 |
+
app = create_interface()
|
375 |
+
app.launch()
|