lovelyai999 commited on
Commit
4512222
·
verified ·
1 Parent(s): 4fe78a6

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +375 -0
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()