Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -1,8 +1,9 @@
|
|
1 |
import gradio as gr
|
2 |
import datetime
|
3 |
import re
|
|
|
4 |
|
5 |
-
class
|
6 |
def __init__(self):
|
7 |
# 천간 (하늘줄기)
|
8 |
self.heavenly_stems = ['갑', '을', '병', '정', '무', '기', '경', '신', '임', '계']
|
@@ -19,93 +20,71 @@ class AdvancedSajuCalculator:
|
|
19 |
'술': '토', '해': '수'
|
20 |
}
|
21 |
|
22 |
-
#
|
23 |
-
self.
|
24 |
-
'
|
25 |
-
'
|
26 |
-
'
|
27 |
-
'
|
28 |
-
'
|
29 |
}
|
30 |
|
31 |
-
#
|
32 |
-
self.
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
('을', '갑'): '겁재', ('을', '을'): '비견', ('을', '병'): '상관', ('을', '정'): '식신',
|
37 |
-
('을', '무'): '정재', ('을', '기'): '편재', ('을', '경'): '정관', ('을', '신'): '편관',
|
38 |
-
('을', '임'): '정인', ('을', '계'): '편인'
|
39 |
}
|
40 |
|
41 |
-
#
|
42 |
-
self.
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
50 |
|
51 |
# 지역별 시간 보정 (서울 기준 분 단위)
|
52 |
self.location_offsets = {
|
53 |
-
'서울': 0, '서울특별시': 0, '경기': 0, '경기도': 0, '인천': 0,
|
54 |
-
'강원': +12, '강원도': +12, '춘천': +12, '
|
55 |
'충북': -8, '충청북도': -8, '청주': -8, '충주': 0,
|
56 |
-
'충남': -16, '충청남도': -16, '대전': -12, '천안': -12,
|
57 |
'전북': -20, '전라북도': -20, '전주': -20, '군산': -24,
|
58 |
-
'전남': -24, '전라남도': -24, '광주': -20, '목포': -32, '여수': -16,
|
59 |
-
'경북': +8, '경상북도': +8, '대구': +4, '포항': +20, '경주': +16,
|
60 |
-
'경남': -4, '경상남도': -4, '부산': +12, '울산': +16, '
|
61 |
'제주': -20, '제주도': -20, '제주시': -20, '서귀포': -20
|
62 |
}
|
63 |
|
64 |
def get_location_offset(self, location):
|
65 |
-
"""
|
66 |
if not location:
|
67 |
return 0
|
|
|
68 |
location = location.strip()
|
|
|
|
|
|
|
|
|
|
|
|
|
69 |
for key, offset in self.location_offsets.items():
|
70 |
if key in location or location in key:
|
71 |
return offset
|
72 |
-
return 0
|
73 |
-
|
74 |
-
def get_solar_term_month(self, year, month, day):
|
75 |
-
"""절기를 고려한 정확한 월주 계산"""
|
76 |
-
# 입춘 기준으로 년도 결정
|
77 |
-
if month == 1 or month == 2:
|
78 |
-
# 입춘(2/4) 이전이면 전년도
|
79 |
-
lichun_date = datetime.date(year, 2, 4)
|
80 |
-
current_date = datetime.date(year, month, day)
|
81 |
-
if current_date < lichun_date:
|
82 |
-
year -= 1
|
83 |
-
|
84 |
-
# 절기 기준 월 계산
|
85 |
-
month_mapping = {
|
86 |
-
(2, 4): 1, # 입춘~경칩 = 정월
|
87 |
-
(3, 6): 2, # 경칩~청명 = 2월
|
88 |
-
(4, 5): 3, # 청명~입하 = 3월
|
89 |
-
(5, 6): 4, # 입하~망종 = 4월
|
90 |
-
(6, 6): 5, # 망종~소서 = 5월
|
91 |
-
(7, 7): 6, # 소서~입추 = 6월
|
92 |
-
(8, 8): 7, # 입추~백로 = 7월
|
93 |
-
(9, 8): 8, # 백로~한로 = 8월
|
94 |
-
(10, 8): 9, # 한로~입동 = 9월
|
95 |
-
(11, 7): 10, # 입동~대설 = 10월
|
96 |
-
(12, 7): 11, # 대설~소한 = 11월
|
97 |
-
(1, 6): 12 # 소한~입춘 = 12월
|
98 |
-
}
|
99 |
-
|
100 |
-
# 현재 날짜가 어느 절기 구간에 속하는지 확인
|
101 |
-
current_date = datetime.date(year if month >= 2 else year + 1, month, day)
|
102 |
|
103 |
-
|
104 |
-
term_date = datetime.date(year if term_month >= 2 else year + 1, term_month, term_day)
|
105 |
-
if current_date >= term_date:
|
106 |
-
solar_month = lunar_month
|
107 |
-
|
108 |
-
return year, solar_month
|
109 |
|
110 |
def parse_date(self, date_str):
|
111 |
"""날짜 파싱"""
|
@@ -167,29 +146,43 @@ class AdvancedSajuCalculator:
|
|
167 |
hour = hour % 24
|
168 |
return hour, minute
|
169 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
170 |
def get_ganzhi(self, year, month, day, hour):
|
171 |
-
"""
|
172 |
-
|
173 |
-
|
174 |
|
175 |
-
# 기준일: 1900년 1월 1일 (경자년 정축월 갑인일)
|
176 |
-
base_date = datetime.date(1900, 1, 1)
|
177 |
-
target_date = datetime.date(year, month, day)
|
178 |
days_diff = (target_date - base_date).days
|
179 |
|
180 |
-
# 연주 계산
|
181 |
-
|
182 |
-
|
183 |
-
year_branch_index = year_cycle % 12
|
184 |
|
185 |
-
# 월주 계산 (절기
|
186 |
-
|
187 |
-
month_branch_index = (
|
|
|
188 |
|
189 |
# 일주 계산
|
190 |
-
|
191 |
-
|
192 |
-
day_branch_index = day_cycle % 12
|
193 |
|
194 |
# 시주 계산
|
195 |
hour_branch_index = ((hour + 1) // 2) % 12
|
@@ -203,240 +196,367 @@ class AdvancedSajuCalculator:
|
|
203 |
}
|
204 |
|
205 |
def analyze_elements(self, ganzhi):
|
206 |
-
"""오행 분석"""
|
207 |
-
|
|
|
|
|
208 |
for pillar in ganzhi.values():
|
209 |
stem_element = self.five_elements[pillar[0]]
|
|
|
|
|
|
|
|
|
210 |
branch_element = self.five_elements[pillar[1]]
|
211 |
-
|
212 |
|
213 |
-
|
214 |
-
for
|
215 |
-
|
|
|
|
|
|
|
216 |
|
217 |
return element_count
|
218 |
|
219 |
def get_ten_gods_analysis(self, ganzhi):
|
220 |
-
"""십신 분석 (
|
221 |
day_stem = ganzhi['day'][0]
|
|
|
222 |
|
223 |
analysis = {}
|
224 |
for pillar_name, pillar in ganzhi.items():
|
225 |
-
|
226 |
-
|
227 |
|
228 |
-
|
229 |
-
|
230 |
-
stem_relation = self.ten_gods[(day_stem, stem)]
|
231 |
-
else:
|
232 |
-
# 기본 오행 관계로 계산
|
233 |
-
day_element = self.five_elements[day_stem]
|
234 |
-
stem_element = self.five_elements[stem]
|
235 |
-
stem_relation = self.get_basic_relation(day_element, stem_element)
|
236 |
|
237 |
-
#
|
238 |
-
|
239 |
-
|
240 |
-
|
|
|
|
|
241 |
|
242 |
analysis[pillar_name] = {
|
243 |
'stem_relation': stem_relation,
|
244 |
-
'branch_relation': branch_relation
|
|
|
245 |
}
|
246 |
|
247 |
return analysis
|
248 |
|
249 |
-
|
250 |
-
|
251 |
-
|
252 |
-
|
253 |
-
|
254 |
-
|
255 |
-
|
256 |
-
|
257 |
-
|
258 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
259 |
|
260 |
def format_saju_result(calculator, ganzhi, elements, ten_gods, birth_info):
|
261 |
-
"""사주 결과 포맷팅 - 전문적인 표
|
262 |
|
263 |
-
# 오행별 색상
|
264 |
-
|
265 |
-
'목':
|
266 |
-
'화':
|
267 |
-
'토':
|
268 |
-
'금':
|
269 |
-
'수':
|
270 |
}
|
271 |
|
272 |
-
def
|
273 |
-
|
274 |
-
return f'<span style="color: {
|
275 |
|
276 |
-
def
|
277 |
-
|
278 |
-
|
279 |
-
|
280 |
-
|
281 |
-
|
282 |
-
return '<span style="color: #6c757d;">**약함**</span>'
|
283 |
|
284 |
# 시간 보정 정보
|
285 |
-
|
286 |
if birth_info['location_offset'] != 0:
|
287 |
sign = "+" if birth_info['location_offset'] > 0 else ""
|
288 |
-
|
289 |
### ⏰ 출생지 시간 보정
|
290 |
- **입력 시간**: {birth_info['original_time']}
|
291 |
-
- **보정 시간**: {birth_info['corrected_time']}
|
292 |
-
- **보정값**: {birth_info['birth_place']} 기준 {sign}{birth_info['location_offset']}분
|
293 |
"""
|
294 |
|
295 |
-
|
296 |
-
|
297 |
-
|
298 |
-
|
299 |
-
month_branch = get_colored_char(ganzhi['month'][1], calculator.five_elements[ganzhi['month'][1]])
|
300 |
-
day_stem = get_colored_char(ganzhi['day'][0], calculator.five_elements[ganzhi['day'][0]])
|
301 |
-
day_branch = get_colored_char(ganzhi['day'][1], calculator.five_elements[ganzhi['day'][1]])
|
302 |
-
hour_stem = get_colored_char(ganzhi['hour'][0], calculator.five_elements[ganzhi['hour'][0]])
|
303 |
-
hour_branch = get_colored_char(ganzhi['hour'][1], calculator.five_elements[ganzhi['hour'][1]])
|
304 |
|
305 |
result = f"""
|
306 |
-
# 🔮 사주명리 만세력
|
307 |
|
308 |
-
## 📋
|
309 |
-
- **생년월일**: {
|
310 |
-
- **출생시간**: {
|
311 |
-
- **성별**: {
|
312 |
-
|
313 |
-
{time_info}
|
314 |
|
315 |
-
## 🏛️ 사주(四柱)
|
316 |
|
317 |
-
<div style="
|
318 |
|
319 |
-
|
|
320 |
-
|
321 |
-
| **천간** | {
|
322 |
-
|
|
323 |
-
|
|
324 |
-
|
|
325 |
-
|
|
|
|
326 |
|
327 |
</div>
|
328 |
|
329 |
-
|
|
|
|
|
330 |
|
331 |
-
## 🌟 오행(五行)
|
332 |
|
333 |
-
<div style="
|
334 |
|
335 |
-
|
|
336 |
-
|
337 |
-
| {
|
338 |
-
| {
|
339 |
-
| {
|
340 |
-
| {
|
341 |
-
| {
|
342 |
|
343 |
</div>
|
344 |
|
345 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
346 |
|
347 |
-
|
|
|
348 |
|
349 |
-
|
350 |
-
|:----------:|:------------:|:------------:|:--------:|
|
351 |
-
| **시주** | {ten_gods['hour']['stem_relation']} | {ten_gods['hour']['branch_relation']} | 자식운·말년운 |
|
352 |
-
| **일주** | {ten_gods['day']['stem_relation']} | {ten_gods['day']['branch_relation']} | 본인·결혼운 |
|
353 |
-
| **월주** | {ten_gods['month']['stem_relation']} | {ten_gods['month']['branch_relation']} | 부모운·사회운 |
|
354 |
-
| **연주** | {ten_gods['year']['stem_relation']} | {ten_gods['year']['branch_relation']} | 조상운·초년운 |
|
355 |
|
356 |
-
|
|
|
357 |
|
358 |
-
|
|
|
|
|
|
|
359 |
|
360 |
-
|
361 |
-
일간 **{get_colored_char(ganzhi['day'][0], calculator.five_elements[ganzhi['day'][0]])}**({element_info[calculator.five_elements[ganzhi['day'][0]]]['name']})의 특성:
|
362 |
|
363 |
-
|
364 |
|
365 |
-
###
|
366 |
-
{
|
|
|
367 |
|
368 |
-
###
|
369 |
-
{
|
370 |
|
371 |
-
|
|
|
|
|
|
|
|
|
372 |
|
373 |
-
|
374 |
-
- ✅ **절기 기준 계산**: 입춘을 기준으로 정확한 연주·월주 산정
|
375 |
-
- ✅ **출생지 시간 보정**: 지역별 경도차 반영
|
376 |
-
- ✅ **전통 명리학**: 정통 사주명리학 이론 적용
|
377 |
|
378 |
-
###
|
379 |
-
본 분석은
|
|
|
|
|
380 |
|
381 |
-
|
382 |
-
*분석 완료: {datetime.datetime.now().strftime('%Y년 %m월 %d일 %H시 %M분')}*
|
383 |
"""
|
384 |
|
385 |
return result
|
386 |
|
387 |
-
def
|
388 |
-
"""
|
389 |
-
|
390 |
-
|
391 |
-
- **성격**: 따뜻하고 인정 많으며, 성장과 발전을 추구하는 성향
|
392 |
-
- **장점**: 창의적, 유연한 사고, 협력적, 포용력이 강함
|
393 |
-
- **특징**: 새로운 것을 배우고 성장하려는 의욕이 강하며, 타인을 도우려는 마음이 큼
|
394 |
-
- **주의점**: 때로는 우유부단하거나 결정을 미루는 경향""",
|
395 |
-
|
396 |
-
'화': """
|
397 |
-
- **성격**: 밝고 활발하며, 열정적이고 사교적인 성향
|
398 |
-
- **장점**: 리더십, 표현력, 긍정적 에너지, 추진력이 강함
|
399 |
-
- **특징**: 사람들과 어울리기를 좋아하며, 새로운 도전을 즐김
|
400 |
-
- **주의점**: 때로는 성급하거나 감정적인 판단을 할 수 있음""",
|
401 |
-
|
402 |
-
'토': """
|
403 |
-
- **성격**: 차분하고 신중하며, 안정을 추구하는 성향
|
404 |
-
- **장점**: 책임감, 인내력, 신뢰성, 포용력이 뛰어남
|
405 |
-
- **특징**: 꾸준하고 성실하며, 다른 사람들의 중재자 역할을 잘함
|
406 |
-
- **주의점**: 때로는 변화에 적응이 늦거나 고집이 셀 수 있음""",
|
407 |
-
|
408 |
-
'금': """
|
409 |
-
- **성격**: 원칙적이고 정의로우며, 강한 의지력을 가진 성향
|
410 |
-
- **장점**: 결단력, 리더십, 정직함, 목표 지향적
|
411 |
-
- **특징**: 옳고 그름이 분명하며, 자신의 신념을 관철시키려 함
|
412 |
-
- **주의점**: 때로는 융통성이 부족하거나 타인에게 엄격할 수 있음""",
|
413 |
-
|
414 |
-
'수': """
|
415 |
-
- **성격**: 지혜롭고 사려 깊으며, 깊이 있는 사고를 하는 성향
|
416 |
-
- **장점**: 통찰력, 적응력, 학습능력, 직관력이 뛰어남
|
417 |
-
- **특징**: 상황을 정확히 파악하고 현명한 판단을 내리는 능력
|
418 |
-
- **주의점**: 때로는 지나치게 신중하거나 소극적일 수 있음"""
|
419 |
-
}
|
420 |
-
return personalities.get(element, "균형 잡힌 성격을 가지고 있습니다.")
|
421 |
-
|
422 |
-
def get_advanced_balance_advice(elements):
|
423 |
-
"""고급 오행 균형 조언"""
|
424 |
-
max_element = max(elements, key=elements.get)
|
425 |
-
min_element = min(elements, key=elements.get)
|
426 |
-
max_count = elements[max_element]
|
427 |
-
min_count = elements[min_element]
|
428 |
|
429 |
-
|
430 |
-
|
431 |
-
|
432 |
-
|
433 |
-
|
434 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
435 |
|
436 |
-
|
437 |
-
|
438 |
-
|
439 |
-
|
440 |
-
|
441 |
-
|
442 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
import gradio as gr
|
2 |
import datetime
|
3 |
import re
|
4 |
+
from calendar import monthrange
|
5 |
|
6 |
+
class SajuCalculator:
|
7 |
def __init__(self):
|
8 |
# 천간 (하늘줄기)
|
9 |
self.heavenly_stems = ['갑', '을', '병', '정', '무', '기', '경', '신', '임', '계']
|
|
|
20 |
'술': '토', '해': '수'
|
21 |
}
|
22 |
|
23 |
+
# 십신
|
24 |
+
self.ten_gods = {
|
25 |
+
'목': {'목': '비견', '화': '식신', '토': '편재', '금': '편관', '수': '편인'},
|
26 |
+
'화': {'목': '편인', '화': '비견', '토': '식신', '금': '편재', '수': '편관'},
|
27 |
+
'토': {'목': '편관', '화': '편인', '토': '비견', '금': '식신', '수': '편재'},
|
28 |
+
'금': {'목': '편재', '화': '편관', '토': '편인', '금': '비견', '수': '식신'},
|
29 |
+
'수': {'목': '식신', '화': '편재', '토': '편관', '금': '편인', '수': '비견'}
|
30 |
}
|
31 |
|
32 |
+
# 지장간 (지지 안에 숨어있는 천간들)
|
33 |
+
self.hidden_stems = {
|
34 |
+
'자': ['계'], '축': ['기', '계', '신'], '인': ['갑', '병', '무'], '묘': ['을'],
|
35 |
+
'진': ['무', '을', '계'], '사': ['병', '무', '경'], '오': ['정', '기'], '미': ['기', '정', '을'],
|
36 |
+
'신': ['경', '임', '무'], '유': ['신'], '술': ['무', '신', '정'], '해': ['임', '갑']
|
|
|
|
|
|
|
37 |
}
|
38 |
|
39 |
+
# 12운성
|
40 |
+
self.twelve_phases = ['장생', '목욕', '관대', '건록', '제왕', '쇠', '병', '사', '묘', '절', '태', '양']
|
41 |
+
|
42 |
+
# 절기 정보 (월별 대략적인 날짜 - 실제로는 년도별로 다름)
|
43 |
+
self.seasonal_divisions = {
|
44 |
+
1: {'소한': 6, '대한': 21},
|
45 |
+
2: {'입춘': 4, '우수': 19},
|
46 |
+
3: {'경칩': 6, '춘분': 21},
|
47 |
+
4: {'청명': 5, '곡우': 20},
|
48 |
+
5: {'입하': 6, '소만': 21},
|
49 |
+
6: {'망종': 6, '하지': 21},
|
50 |
+
7: {'소서': 7, '대서': 23},
|
51 |
+
8: {'입추': 8, '처서': 23},
|
52 |
+
9: {'백로': 8, '추분': 23},
|
53 |
+
10: {'한로': 8, '상강': 24},
|
54 |
+
11: {'입동': 7, '소설': 22},
|
55 |
+
12: {'대설': 7, '동지': 22}
|
56 |
+
}
|
57 |
|
58 |
# 지역별 시간 보정 (서울 기준 분 단위)
|
59 |
self.location_offsets = {
|
60 |
+
'서울': 0, '서울특별시': 0, '경기': 0, '경기도': 0, '인천': 0, '인천광역시': 0,
|
61 |
+
'강원': +12, '강원도': +12, '춘천': +12, '원주': +8, '강릉': +20,
|
62 |
'충북': -8, '충청북도': -8, '청주': -8, '충주': 0,
|
63 |
+
'충남': -16, '충청남도': -16, '대전': -12, '대전광역시': -12, '천안': -12,
|
64 |
'전북': -20, '전라북도': -20, '전주': -20, '군산': -24,
|
65 |
+
'전남': -24, '전라남도': -24, '광주': -20, '광주광역시': -20, '목포': -32, '여수': -16,
|
66 |
+
'경북': +8, '경상북도': +8, '대구': +4, '대구광역시': +4, '포항': +20, '경주': +16,
|
67 |
+
'경남': -4, '경상남도': -4, '부산': +12, '부산광역시': +12, '울산': +16, '울산광역시': +16, '창원': +4, '마산': +4, '진주': -8,
|
68 |
'제주': -20, '제주도': -20, '제주시': -20, '서귀포': -20
|
69 |
}
|
70 |
|
71 |
def get_location_offset(self, location):
|
72 |
+
"""출생지에 따른 시간 보정값 반환 (분 단위)"""
|
73 |
if not location:
|
74 |
return 0
|
75 |
+
|
76 |
location = location.strip()
|
77 |
+
|
78 |
+
# 정확한 매칭 시도
|
79 |
+
if location in self.location_offsets:
|
80 |
+
return self.location_offsets[location]
|
81 |
+
|
82 |
+
# 부분 매칭 시도
|
83 |
for key, offset in self.location_offsets.items():
|
84 |
if key in location or location in key:
|
85 |
return offset
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
86 |
|
87 |
+
return 0 # 기본값 (서울 기준)
|
|
|
|
|
|
|
|
|
|
|
88 |
|
89 |
def parse_date(self, date_str):
|
90 |
"""날짜 파싱"""
|
|
|
146 |
hour = hour % 24
|
147 |
return hour, minute
|
148 |
|
149 |
+
def get_seasonal_month(self, year, month, day):
|
150 |
+
"""절기를 고려한 월주 계산"""
|
151 |
+
# 간단한 절기 계산 (정확하지 않지만 대략적)
|
152 |
+
seasonal_month = month
|
153 |
+
|
154 |
+
# 입춘(2월 4일경) 기준으로 월 조정
|
155 |
+
if month == 1:
|
156 |
+
seasonal_month = 12 # 12월 (축월)
|
157 |
+
elif month == 2:
|
158 |
+
if day < 4: # 입춘 전
|
159 |
+
seasonal_month = 12
|
160 |
+
else: # 입춘 후
|
161 |
+
seasonal_month = 1 # 1월 (인월)
|
162 |
+
else:
|
163 |
+
seasonal_month = month - 1
|
164 |
+
|
165 |
+
return seasonal_month
|
166 |
+
|
167 |
def get_ganzhi(self, year, month, day, hour):
|
168 |
+
"""간지 계산 (절기 고려)"""
|
169 |
+
base_date = datetime.datetime(1900, 1, 1)
|
170 |
+
target_date = datetime.datetime(year, month, day)
|
171 |
|
|
|
|
|
|
|
172 |
days_diff = (target_date - base_date).days
|
173 |
|
174 |
+
# 연주 계산
|
175 |
+
year_stem_index = (year - 1900 + 6) % 10
|
176 |
+
year_branch_index = (year - 1900 + 0) % 12
|
|
|
177 |
|
178 |
+
# 월주 계산 (절기 고려)
|
179 |
+
seasonal_month = self.get_seasonal_month(year, month, day)
|
180 |
+
month_branch_index = (seasonal_month + 1) % 12 # 인월부터 시작
|
181 |
+
month_stem_index = (year_stem_index * 2 + seasonal_month) % 10
|
182 |
|
183 |
# 일주 계산
|
184 |
+
day_stem_index = (days_diff + 10) % 10
|
185 |
+
day_branch_index = (days_diff + 2) % 12
|
|
|
186 |
|
187 |
# 시주 계산
|
188 |
hour_branch_index = ((hour + 1) // 2) % 12
|
|
|
196 |
}
|
197 |
|
198 |
def analyze_elements(self, ganzhi):
|
199 |
+
"""오행 분석 (지장간 포함)"""
|
200 |
+
element_count = {'목': 0, '화': 0, '토': 0, '금': 0, '수': 0}
|
201 |
+
|
202 |
+
# 천간 오행 (가중치 1.0)
|
203 |
for pillar in ganzhi.values():
|
204 |
stem_element = self.five_elements[pillar[0]]
|
205 |
+
element_count[stem_element] += 1.0
|
206 |
+
|
207 |
+
# 지지 오행 (가중치 0.8)
|
208 |
+
for pillar in ganzhi.values():
|
209 |
branch_element = self.five_elements[pillar[1]]
|
210 |
+
element_count[branch_element] += 0.8
|
211 |
|
212 |
+
# 지장간 오행 (가중치 0.3)
|
213 |
+
for pillar in ganzhi.values():
|
214 |
+
hidden = self.hidden_stems[pillar[1]]
|
215 |
+
for stem in hidden:
|
216 |
+
stem_element = self.five_elements[stem]
|
217 |
+
element_count[stem_element] += 0.3 / len(hidden)
|
218 |
|
219 |
return element_count
|
220 |
|
221 |
def get_ten_gods_analysis(self, ganzhi):
|
222 |
+
"""십신 분석 (지장간 포함)"""
|
223 |
day_stem = ganzhi['day'][0]
|
224 |
+
day_element = self.five_elements[day_stem]
|
225 |
|
226 |
analysis = {}
|
227 |
for pillar_name, pillar in ganzhi.items():
|
228 |
+
stem_element = self.five_elements[pillar[0]]
|
229 |
+
branch_element = self.five_elements[pillar[1]]
|
230 |
|
231 |
+
stem_relation = self.ten_gods[day_element][stem_element]
|
232 |
+
branch_relation = self.ten_gods[day_element][branch_element]
|
|
|
|
|
|
|
|
|
|
|
|
|
233 |
|
234 |
+
# 지장간 십신
|
235 |
+
hidden_relations = []
|
236 |
+
for hidden_stem in self.hidden_stems[pillar[1]]:
|
237 |
+
hidden_element = self.five_elements[hidden_stem]
|
238 |
+
hidden_relation = self.ten_gods[day_element][hidden_element]
|
239 |
+
hidden_relations.append(f"{hidden_stem}({hidden_relation})")
|
240 |
|
241 |
analysis[pillar_name] = {
|
242 |
'stem_relation': stem_relation,
|
243 |
+
'branch_relation': branch_relation,
|
244 |
+
'hidden_relations': hidden_relations
|
245 |
}
|
246 |
|
247 |
return analysis
|
248 |
|
249 |
+
def get_element_personality(element):
|
250 |
+
"""오행별 성격 특성"""
|
251 |
+
personalities = {
|
252 |
+
'목': "창의적이고 성장 지향적이며, 유연하고 협력적인 성격을 가지고 있습니다.",
|
253 |
+
'화': "열정적이고 활동적이며, 밝고 사교적인 성격을 가지고 있습니다.",
|
254 |
+
'토': "안정적이고 신중하며, 포용력이 있고 책임감이 강한 성격을 가지고 있습니다.",
|
255 |
+
'금': "원칙적이고 정의로우며, 결단력이 있고 리더십이 강한 성격을 가지고 있습니다.",
|
256 |
+
'수': "지혜롭고 적응력이 있으며, 깊이 있고 신중한 성격을 가지고 있습니다."
|
257 |
+
}
|
258 |
+
return personalities.get(element, "균형 잡힌 성격을 가지고 있습니다.")
|
259 |
+
|
260 |
+
def get_element_balance_advice(elements):
|
261 |
+
"""오행 균형에 따른 조언"""
|
262 |
+
max_element = max(elements, key=elements.get)
|
263 |
+
min_element = min(elements, key=elements.get)
|
264 |
+
|
265 |
+
advice = f"현재 {max_element}가 가장 강하고 {min_element}가 가장 약합니다. "
|
266 |
+
|
267 |
+
if elements[max_element] - elements[min_element] > 2:
|
268 |
+
advice += f"{min_element}를 보강하고 {max_element}의 기운을 조절하는 것이 좋겠습니다."
|
269 |
+
else:
|
270 |
+
advice += "전체적으로 균형이 잘 잡혀 있는 편입니다."
|
271 |
+
|
272 |
+
return advice
|
273 |
|
274 |
def format_saju_result(calculator, ganzhi, elements, ten_gods, birth_info):
|
275 |
+
"""사주 결과 포맷팅 - 전문적인 표 형태로 출력"""
|
276 |
|
277 |
+
# 오행별 색상 설정
|
278 |
+
element_colors = {
|
279 |
+
'목': '#28a745', # 녹색
|
280 |
+
'화': '#dc3545', # 빨강
|
281 |
+
'토': '#ffc107', # 노랑
|
282 |
+
'금': '#6c757d', # 회색
|
283 |
+
'수': '#007bff' # 파랑
|
284 |
}
|
285 |
|
286 |
+
def get_colored_element(char, element):
|
287 |
+
color = element_colors.get(element, '#000000')
|
288 |
+
return f'<span style="color: {color}; font-weight: bold;">{char}</span>'
|
289 |
|
290 |
+
def get_colored_ganzhi(stem, branch):
|
291 |
+
stem_element = calculator.five_elements[stem]
|
292 |
+
branch_element = calculator.five_elements[branch]
|
293 |
+
colored_stem = get_colored_element(stem, stem_element)
|
294 |
+
colored_branch = get_colored_element(branch, branch_element)
|
295 |
+
return f'{colored_stem}{colored_branch}'
|
|
|
296 |
|
297 |
# 시간 보정 정보
|
298 |
+
time_correction_info = ""
|
299 |
if birth_info['location_offset'] != 0:
|
300 |
sign = "+" if birth_info['location_offset'] > 0 else ""
|
301 |
+
time_correction_info = f"""
|
302 |
### ⏰ 출생지 시간 보정
|
303 |
- **입력 시간**: {birth_info['original_time']}
|
304 |
+
- **보정 시간**: {birth_info['corrected_time']} ({birth_info['birth_place']} 기준 {sign}{birth_info['location_offset']}분 보정)
|
|
|
305 |
"""
|
306 |
|
307 |
+
birth_datetime = birth_info['birth_datetime']
|
308 |
+
gender = birth_info['gender']
|
309 |
+
birth_place = birth_info['birth_place']
|
310 |
+
corrected_time = birth_info['corrected_time']
|
|
|
|
|
|
|
|
|
|
|
311 |
|
312 |
result = f"""
|
313 |
+
# 🔮 사주명리 만세력 분석결과
|
314 |
|
315 |
+
## 📋 기본정보
|
316 |
+
- **생년월일**: {birth_datetime.strftime('%Y년 %m월 %d일')}
|
317 |
+
- **출생시간**: {corrected_time} ({birth_place})
|
318 |
+
- **성별**: {gender}
|
319 |
+
{time_correction_info}
|
|
|
320 |
|
321 |
+
## 🏛️ 사주(四柱) 만세력표
|
322 |
|
323 |
+
<div style="text-align: center; font-size: 16px;">
|
324 |
|
325 |
+
| 구분 | **시주(時柱)** | **일주(日柱)** | **월주(月柱)** | **연주(年柱)** |
|
326 |
+
|:---:|:---:|:---:|:---:|:---:|
|
327 |
+
| **천간** | {get_colored_element(ganzhi['hour'][0], calculator.five_elements[ganzhi['hour'][0]])} | {get_colored_element(ganzhi['day'][0], calculator.five_elements[ganzhi['day'][0]])} | {get_colored_element(ganzhi['month'][0], calculator.five_elements[ganzhi['month'][0]])} | {get_colored_element(ganzhi['year'][0], calculator.five_elements[ganzhi['year'][0]])} |
|
328 |
+
| **십신** | {ten_gods['hour']['stem_relation']} | {ten_gods['day']['stem_relation']} | {ten_gods['month']['stem_relation']} | {ten_gods['year']['stem_relation']} |
|
329 |
+
| **지지** | {get_colored_element(ganzhi['hour'][1], calculator.five_elements[ganzhi['hour'][1]])} | {get_colored_element(ganzhi['day'][1], calculator.five_elements[ganzhi['day'][1]])} | {get_colored_element(ganzhi['month'][1], calculator.five_elements[ganzhi['month'][1]])} | {get_colored_element(ganzhi['year'][1], calculator.five_elements[ganzhi['year'][1]])} |
|
330 |
+
| **십신** | {ten_gods['hour']['branch_relation']} | {ten_gods['day']['branch_relation']} | {ten_gods['month']['branch_relation']} | {ten_gods['year']['branch_relation']} |
|
331 |
+
| **간지** | **{get_colored_ganzhi(ganzhi['hour'][0], ganzhi['hour'][1])}** | **{get_colored_ganzhi(ganzhi['day'][0], ganzhi['day'][1])}** | **{get_colored_ganzhi(ganzhi['month'][0], ganzhi['month'][1])}** | **{get_colored_ganzhi(ganzhi['year'][0], ganzhi['year'][1])}** |
|
332 |
+
| **지장간** | {"·".join(calculator.hidden_stems[ganzhi['hour'][1]])} | {"·".join(calculator.hidden_stems[ganzhi['day'][1]])} | {"·".join(calculator.hidden_stems[ganzhi['month'][1]])} | {"·".join(calculator.hidden_stems[ganzhi['year'][1]])} |
|
333 |
|
334 |
</div>
|
335 |
|
336 |
+
**💫 사주 구성**
|
337 |
+
- **일간(日干)**: {get_colored_element(ganzhi['day'][0], calculator.five_elements[ganzhi['day'][0]])} - 본인을 나타내는 핵심 요소
|
338 |
+
- **월령(月令)**: {get_colored_element(ganzhi['month'][1], calculator.five_elements[ganzhi['month'][1]])} - 계절의 기운과 성장 환경
|
339 |
|
340 |
+
## 🌟 오행(五行) 분석
|
341 |
|
342 |
+
<div style="text-align: center;">
|
343 |
|
344 |
+
| 오행 | 천간+지지+지장간 | 비율 | 상태 | 특징 |
|
345 |
+
|:---:|:---:|:---:|:---:|:---:|
|
346 |
+
| {get_colored_element('목', '목')} | {elements['목']:.1f}점 | {(elements['목']/sum(elements.values())*100):.1f}% | {'매우강함' if elements['목'] >= 3 else '강함' if elements['목'] >= 2 else '보통' if elements['목'] >= 1 else '약함'} | 성장, 창의, 인자함 |
|
347 |
+
| {get_colored_element('화', '화')} | {elements['화']:.1f}점 | {(elements['화']/sum(elements.values())*100):.1f}% | {'매우강함' if elements['화'] >= 3 else '강함' if elements['화'] >= 2 else '보통' if elements['화'] >= 1 else '약함'} | 열정, 활동, 표현력 |
|
348 |
+
| {get_colored_element('토', '토')} | {elements['토']:.1f}점 | {(elements['토']/sum(elements.values())*100):.1f}% | {'매우강함' if elements['토'] >= 3 else '강함' if elements['토'] >= 2 else '보통' if elements['토'] >= 1 else '약함'} | 안정, 포용, 신뢰 |
|
349 |
+
| {get_colored_element('금', '금')} | {elements['금']:.1f}점 | {(elements['금']/sum(elements.values())*100):.1f}% | {'매우강함' if elements['금'] >= 3 else '강함' if elements['금'] >= 2 else '보통' if elements['금'] >= 1 else '약함'} | 의지, 결단, 정의 |
|
350 |
+
| {get_colored_element('수', '수')} | {elements['수']:.1f}점 | {(elements['수']/sum(elements.values())*100):.1f}% | {'매우강함' if elements['수'] >= 3 else '강함' if elements['수'] >= 2 else '보통' if elements['수'] >= 1 else '약함'} | 지혜, 유연, 깊이 |
|
351 |
|
352 |
</div>
|
353 |
|
354 |
+
### 오행 균형 분석
|
355 |
+
"""
|
356 |
+
|
357 |
+
max_element = max(elements, key=elements.get)
|
358 |
+
min_element = min(elements, key=elements.get)
|
359 |
+
|
360 |
+
result += f"- **가장 강한 오행**: {get_colored_element(max_element, max_element)} ({elements[max_element]:.1f}점)\n"
|
361 |
+
result += f"- **가장 약한 오행**: {get_colored_element(min_element, min_element)} ({elements[min_element]:.1f}점)\n"
|
362 |
|
363 |
+
result += """
|
364 |
+
## 🎭 십신(十神) 세부 분석
|
365 |
|
366 |
+
<div style="text-align: center;">
|
|
|
|
|
|
|
|
|
|
|
367 |
|
368 |
+
| 구분 | **시주** | **일주** | **월주** | **연주** |
|
369 |
+
|:---:|:---:|:---:|:---:|:---:|"""
|
370 |
|
371 |
+
result += f"""
|
372 |
+
| **천간 십신** | {ten_gods['hour']['stem_relation']} | {ten_gods['day']['stem_relation']} | {ten_gods['month']['stem_relation']} | {ten_gods['year']['stem_relation']} |
|
373 |
+
| **지지 십신** | {ten_gods['hour']['branch_relation']} | {ten_gods['day']['branch_relation']} | {ten_gods['month']['branch_relation']} | {ten_gods['year']['branch_relation']} |
|
374 |
+
| **지장간** | {' '.join(ten_gods['hour']['hidden_relations'])} | {' '.join(ten_gods['day']['hidden_relations'])} | {' '.join(ten_gods['month']['hidden_relations'])} | {' '.join(ten_gods['year']['hidden_relations'])} |
|
375 |
|
376 |
+
</div>
|
|
|
377 |
|
378 |
+
## 💡 종합 해석
|
379 |
|
380 |
+
### 일간 분석
|
381 |
+
- **일간**: {get_colored_element(ganzhi['day'][0], calculator.five_elements[ganzhi['day'][0]])} ({calculator.five_elements[ganzhi['day'][0]]}행)
|
382 |
+
- **성격**: {get_element_personality(calculator.five_elements[ganzhi['day'][0]])}
|
383 |
|
384 |
+
### 오행 조화 분석
|
385 |
+
{get_element_balance_advice(elements)}
|
386 |
|
387 |
+
### 십신 구성 특징
|
388 |
+
- **관성(편관/정관)**: {"있음" if any("관" in str(ten_gods[p]['stem_relation']) or "관" in str(ten_gods[p]['branch_relation']) for p in ten_gods) else "없음"} - 리더십, 책임감
|
389 |
+
- **재성(편재/정재)**: {"있음" if any("재" in str(ten_gods[p]['stem_relation']) or "재" in str(ten_gods[p]['branch_relation']) for p in ten_gods) else "없음"} - 재물운, 실용성
|
390 |
+
- **인성(편인/정인)**: {"있음" if any("인" in str(ten_gods[p]['stem_relation']) or "인" in str(ten_gods[p]['branch_relation']) for p in ten_gods) else "없음"} - 학습력, 지혜
|
391 |
+
- **식상(식신/상관)**: {"있음" if any("식" in str(ten_gods[p]['stem_relation']) or "상" in str(ten_gods[p]['branch_relation']) for p in ten_gods) else "없음"} - 창의력, 표현력
|
392 |
|
393 |
+
---
|
|
|
|
|
|
|
394 |
|
395 |
+
### 📌 주의사항
|
396 |
+
- 본 분석은 절기를 고려한 전통 사주명리학 원리에 따른 것입니다
|
397 |
+
- 지장간과 십신 관계를 포함한 종합적 분석입니다
|
398 |
+
- 정확한 운세 해석을 위해서는 전문가 상담을 권장합니다
|
399 |
|
400 |
+
*분석 일시: {datetime.datetime.now().strftime('%Y년 %m월 %d일 %H시 %M분')}*
|
|
|
401 |
"""
|
402 |
|
403 |
return result
|
404 |
|
405 |
+
def calculate_saju(birth_date, birth_time, gender, birth_place):
|
406 |
+
"""사주 계산 메인 함수"""
|
407 |
+
# SajuCalculator 인스턴스 생성
|
408 |
+
calculator = SajuCalculator()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
409 |
|
410 |
+
try:
|
411 |
+
# 입력 검증
|
412 |
+
if not birth_date:
|
413 |
+
return "❌ 생년월일을 입력해주세요."
|
414 |
+
|
415 |
+
# 날짜 파싱
|
416 |
+
year, month, day = calculator.parse_date(birth_date)
|
417 |
+
|
418 |
+
# 시간 파싱
|
419 |
+
hour, minute = calculator.parse_time(birth_time)
|
420 |
+
|
421 |
+
# 출생지에 따른 시간 보정
|
422 |
+
location_offset = calculator.get_location_offset(birth_place)
|
423 |
+
|
424 |
+
# 보정된 시간 계산
|
425 |
+
corrected_minute = minute + location_offset
|
426 |
+
corrected_hour = hour
|
427 |
+
|
428 |
+
# 분이 60을 넘거나 0 미만인 경우 시간 조정
|
429 |
+
if corrected_minute >= 60:
|
430 |
+
corrected_hour += corrected_minute // 60
|
431 |
+
corrected_minute = corrected_minute % 60
|
432 |
+
elif corrected_minute < 0:
|
433 |
+
corrected_hour -= (-corrected_minute - 1) // 60 + 1
|
434 |
+
corrected_minute = 60 + (corrected_minute % 60)
|
435 |
+
|
436 |
+
# 시간이 24를 넘거나 0 미만인 경우 조정
|
437 |
+
corrected_hour = corrected_hour % 24
|
438 |
+
|
439 |
+
# 날짜 유효성 검사
|
440 |
+
if year < 1900 or year > 2100:
|
441 |
+
return f"❌ 연도는 1900~2100 사이여야 합니다. 입력된 연도: {year}"
|
442 |
+
if month < 1 or month > 12:
|
443 |
+
return f"❌ 월은 1~12 사이여야 합니다. 입력된 월: {month}"
|
444 |
+
if day < 1 or day > 31:
|
445 |
+
return f"❌ 일은 1~31 사이여야 합니다. 입력된 일: {day}"
|
446 |
+
|
447 |
+
# datetime 객체 생성 (보정된 시간 사용)
|
448 |
+
birth_datetime = datetime.datetime(year, month, day, corrected_hour, corrected_minute)
|
449 |
+
original_time = f"{hour:02d}:{minute:02d}"
|
450 |
+
corrected_time = f"{corrected_hour:02d}:{corrected_minute:02d}"
|
451 |
+
|
452 |
+
# 출생 정보 딕셔너리
|
453 |
+
birth_info = {
|
454 |
+
'birth_datetime': birth_datetime,
|
455 |
+
'gender': gender,
|
456 |
+
'birth_place': birth_place,
|
457 |
+
'original_time': original_time,
|
458 |
+
'corrected_time': corrected_time,
|
459 |
+
'location_offset': location_offset
|
460 |
+
}
|
461 |
+
|
462 |
+
# 간지 계산 (절기 고려)
|
463 |
+
ganzhi = calculator.get_ganzhi(year, month, day, corrected_hour)
|
464 |
+
|
465 |
+
# 오행 분석 (지장간 포함)
|
466 |
+
elements = calculator.analyze_elements(ganzhi)
|
467 |
+
|
468 |
+
# 십신 분석 (지장간 포함)
|
469 |
+
ten_gods = calculator.get_ten_gods_analysis(ganzhi)
|
470 |
+
|
471 |
+
# 결과 포맷팅
|
472 |
+
result = format_saju_result(calculator, ganzhi, elements, ten_gods, birth_info)
|
473 |
+
|
474 |
+
return result
|
475 |
+
|
476 |
+
except ValueError as ve:
|
477 |
+
return f"❌ 입력 오류: {str(ve)}\n\n💡 입력 예시:\n- 생년월일: 19851015, 1985-10-15\n- 시간: 1430, 14:30"
|
478 |
|
479 |
+
except Exception as e:
|
480 |
+
return f"❌ 계산 중 오류가 발생했습니다: {str(e)}"
|
481 |
+
|
482 |
+
def create_interface():
|
483 |
+
"""Gradio 인터페이스 생성"""
|
484 |
+
with gr.Blocks(title="🔮 전문 사주명리 만세력 시스템") as demo:
|
485 |
+
gr.HTML("""
|
486 |
+
<div style="text-align: center; padding: 20px;">
|
487 |
+
<h1>🔮 전문 사주명리학 만세력 분석 시스템</h1>
|
488 |
+
<p><strong>절기 고려 · 지장간 분석 · 출생지 시간 보정</strong></p>
|
489 |
+
<p>생년월일시와 출생지 정보를 입력하시면 전문적인 만세력을 분석해드립니다.</p>
|
490 |
+
</div>
|
491 |
+
""")
|
492 |
+
|
493 |
+
with gr.Row():
|
494 |
+
with gr.Column(scale=1):
|
495 |
+
gr.HTML("<h3>📝 정보 입력</h3>")
|
496 |
+
|
497 |
+
birth_date = gr.Textbox(
|
498 |
+
label="생년월일",
|
499 |
+
placeholder="19851015 또는 1985-10-15",
|
500 |
+
info="8자리 숫자 또는 구분자 포함하여 입력 (양력 기준)"
|
501 |
+
)
|
502 |
+
|
503 |
+
birth_time = gr.Textbox(
|
504 |
+
label="태어난 시간 (선택사항)",
|
505 |
+
placeholder="1430 또는 14:30",
|
506 |
+
info="정확한 시간을 입력하세요. 비우면 정오(12시)로 설정됩니다."
|
507 |
+
)
|
508 |
+
|
509 |
+
gender = gr.Radio(
|
510 |
+
choices=["남", "여"],
|
511 |
+
label="성별",
|
512 |
+
value="남"
|
513 |
+
)
|
514 |
+
|
515 |
+
birth_place = gr.Textbox(
|
516 |
+
label="출생지",
|
517 |
+
placeholder="서울특별시",
|
518 |
+
info="정확한 출생지를 입력하면 시간 보정이 적용됩니다"
|
519 |
+
)
|
520 |
+
|
521 |
+
calculate_btn = gr.Button(
|
522 |
+
"🔮 전문 만세력 분석하기",
|
523 |
+
variant="primary"
|
524 |
+
)
|
525 |
+
|
526 |
+
with gr.Row():
|
527 |
+
with gr.Column():
|
528 |
+
result_output = gr.Markdown(
|
529 |
+
label="분석 결과",
|
530 |
+
value="👆 위의 정보를 입력하고 '전문 만세력 분석하기' 버튼을 클릭하세요."
|
531 |
+
)
|
532 |
+
|
533 |
+
# 이벤트 연결
|
534 |
+
calculate_btn.click(
|
535 |
+
fn=calculate_saju,
|
536 |
+
inputs=[birth_date, birth_time, gender, birth_place],
|
537 |
+
outputs=result_output
|
538 |
+
)
|
539 |
+
|
540 |
+
gr.HTML("""
|
541 |
+
<div style="text-align: center; padding: 20px; margin-top: 30px; border-top: 1px solid #eee;">
|
542 |
+
<h4>🔍 시스템 특징</h4>
|
543 |
+
<div style="display: flex; justify-content: center; gap: 30px; flex-wrap: wrap;">
|
544 |
+
<div>✅ <strong>절기 고려</strong><br>정확한 월주 계산</div>
|
545 |
+
<div>✅ <strong>지장간 분석</strong><br>지지 안 숨은 천간</div>
|
546 |
+
<div>✅ <strong>십신 세분화</strong><br>천간/지지/지장간별</div>
|
547 |
+
<div>✅ <strong>시간 보정</strong><br>전국 지역별 적용</div>
|
548 |
+
<div>✅ <strong>오행 가중치</strong><br>천간/지지/지장간</div>
|
549 |
+
</div>
|
550 |
+
<p style="margin-top: 15px;"><small>※ 본 시스템은 전통 사주명리학을 기반으로 하며, 참고용으로만 활용해주시기 바랍니다.</small></p>
|
551 |
+
</div>
|
552 |
+
""")
|
553 |
+
|
554 |
+
return demo
|
555 |
+
|
556 |
+
if __name__ == "__main__":
|
557 |
+
demo = create_interface()
|
558 |
+
demo.launch(
|
559 |
+
server_name="0.0.0.0",
|
560 |
+
server_port=7860,
|
561 |
+
share=True
|
562 |
+
)
|