test1 / app.py
ssboost's picture
Update app.py
cb40b3b verified
raw
history blame
10.9 kB
import gradio as gr
# MBTI 질문 데이터 (각 차원당 5개씩 총 20개)
questions = [
# E vs I (외향 vs 내향)
{"text": "새로운 사람들을 만나는 것이 즐겁고 에너지가 충전된다.", "dimension": "EI", "direction": "E"},
{"text": "혼자만의 시간을 보내는 것이 더 편하고 재충전된다.", "dimension": "EI", "direction": "I"},
{"text": "파티나 모임에서 먼저 다가가서 대화를 시작하는 편이다.", "dimension": "EI", "direction": "E"},
{"text": "깊은 대화를 나눌 수 있는 소수의 친구를 선호한다.", "dimension": "EI", "direction": "I"},
{"text": "여러 사람과 함께 있을 때 활기차고 말이 많아진다.", "dimension": "EI", "direction": "E"},
# S vs N (감각 vs 직관)
{"text": "구체적이고 현실적인 사실들에 집중하는 편이다.", "dimension": "SN", "direction": "S"},
{"text": "가능성과 미래의 잠재력을 상상하는 것을 좋아한다.", "dimension": "SN", "direction": "N"},
{"text": "세부사항과 구체적인 정보를 중요하게 여긴다.", "dimension": "SN", "direction": "S"},
{"text": "패턴을 찾고 숨겨진 의미를 해석하는 것을 즐긴다.", "dimension": "SN", "direction": "N"},
{"text": "경험을 통해 배운 검증된 방법을 신뢰한다.", "dimension": "SN", "direction": "S"},
# T vs F (사고 vs 감정)
{"text": "결정을 내릴 때 논리와 객관적 기준을 우선시한다.", "dimension": "TF", "direction": "T"},
{"text": "결정을 내릴 때 사람들의 감정과 조화를 고려한다.", "dimension": "TF", "direction": "F"},
{"text": "비판적으로 분석하고 문제점을 찾아내는 것을 잘한다.", "dimension": "TF", "direction": "T"},
{"text": "다른 사람의 감정을 쉽게 공감하고 이해한다.", "dimension": "TF", "direction": "F"},
{"text": "공정함과 원칙이 인간관계보다 중요하다고 생각한다.", "dimension": "TF", "direction": "T"},
# J vs P (판단 vs 인식)
{"text": "계획을 세우고 일정에 맞춰 진행하는 것을 선호한다.", "dimension": "JP", "direction": "J"},
{"text": "융통성 있게 상황에 맞춰 대응하는 것을 좋아한다.", "dimension": "JP", "direction": "P"},
{"text": "마감 기한을 여유 있게 두고 미리미리 처리한다.", "dimension": "JP", "direction": "J"},
{"text": "여러 가능성을 열어두고 마지막 순간에 결정한다.", "dimension": "JP", "direction": "P"},
{"text": "체계적이고 조직적인 환경을 선호한다.", "dimension": "JP", "direction": "J"},
]
# MBTI 유형별 설명
mbti_descriptions = {
"INTJ": {
"title": "전략가 (Architect)",
"description": "상상력이 풍부하고 전략적인 사고를 가진 완벽주의자입니다.",
"strengths": "논리적, 독립적, 결단력 있음, 창의적 문제 해결",
"weaknesses": "지나치게 비판적, 감정 표현 어려움, 고집스러움"
},
"INTP": {
"title": "논리술사 (Logician)",
"description": "혁신적인 발명가로 끊임없는 지식의 갈증을 가지고 있습니다.",
"strengths": "분석적, 객관적, 창의적, 열린 마음",
"weaknesses": "실용성 부족, 감정 둔감, 우유부단함"
},
"ENTJ": {
"title": "통솔자 (Commander)",
"description": "대담하고 상상력이 풍부한 강력한 지도자입니다.",
"strengths": "리더십, 효율적, 자신감, 전략적 사고",
"weaknesses": "참을성 부족, 오만함, 감정 무시"
},
"ENTP": {
"title": "변론가 (Debater)",
"description": "똑똑하고 호기심 많은 사색가로 지적 도전을 즐깁니다.",
"strengths": "창의적, 카리스마, 에너지 넘침, 논쟁 능력",
"weaknesses": "논쟁적, 무감각, 집중력 부족"
},
"INFJ": {
"title": "옹호자 (Advocate)",
"description": "조용하고 신비로우며 사람들에게 영감을 주는 이상주의자입니다.",
"strengths": "통찰력, 결단력, 이타적, 창의적",
"weaknesses": "민감함, 완벽주의, 소진되기 쉬움"
},
"INFP": {
"title": "중재자 (Mediator)",
"description": "항상 선을 행할 준비가 되어 있는 이타적이고 부드러운 사람입니다.",
"strengths": "공감 능력, 창의적, 열정적, 헌신적",
"weaknesses": "비현실적, 자기비판적, 감정적"
},
"ENFJ": {
"title": "선도자 (Protagonist)",
"description": "카리스마 있고 영감을 주는 지도자로 청중을 사로잡습니다.",
"strengths": "카리스마, 이타적, 영감을 줌, 자연스러운 리더",
"weaknesses": "지나치게 이상적, 자기희생적, 민감함"
},
"ENFP": {
"title": "활동가 (Campaigner)",
"description": "열정적이고 창의적이며 긍정적인 자유로운 영혼입니다.",
"strengths": "열정적, 창의적, 사교적, 낙관적",
"weaknesses": "산만함, 스트레스 취약, 지나친 감정 이입"
},
"ISTJ": {
"title": "현실주의자 (Logistician)",
"description": "실용적이고 사실에 기반한 믿음직한 사람입니다.",
"strengths": "책임감, 정직함, 실용적, 차분함",
"weaknesses": "고집스러움, 둔감함, 규칙 고수"
},
"ISFJ": {
"title": "수호자 (Defender)",
"description": "헌신적이고 따뜻한 수호자로 소중한 사람들을 지킵니다.",
"strengths": "지지적, 신뢰할 수 있음, 인내심, 실용적",
"weaknesses": "겸손함, 변화 회피, 과부하"
},
"ESTJ": {
"title": "경영자 (Executive)",
"description": "뛰어난 관리자로 사람들이나 일을 관리하는 데 타고났습니다.",
"strengths": "조직력, 정직함, 헌신적, 결단력",
"weaknesses": "완고함, 감정 무시, 비판적"
},
"ESFJ": {
"title": "집정관 (Consul)",
"description": "배려심이 많고 사교적이며 인기가 많은 사람입니다.",
"strengths": "지지적, 책임감, 충성스러움, 민감함",
"weaknesses": "걱정 많음, 비판에 취약, 자기주장 어려움"
},
"ISTP": {
"title": "장인 (Virtuoso)",
"description": "대담하고 실용적인 실험가로 모든 도구를 다룹니다.",
"strengths": "낙관적, 창의적, 실용적, 자발적",
"weaknesses": "완고함, 둔감함, 쉽게 지루함"
},
"ISFP": {
"title": "모험가 (Adventurer)",
"description": "유연하고 매력적인 예술가로 새로운 것을 탐험할 준비가 되어 있습니다.",
"strengths": "매력적, 민감함, 상상력, 호기심",
"weaknesses": "섬세함, 독립적 과함, 예측 불가능"
},
"ESTP": {
"title": "사업가 (Entrepreneur)",
"description": "영리하고 에너지 넘치며 매우 지각적인 사람입니다.",
"strengths": "대담함, 실용적, 직관적, 사교적",
"weaknesses": "무감각함, 참을성 없음, 위험 감수"
},
"ESFP": {
"title": "연예인 (Entertainer)",
"description": "자발적이고 에너지 넘치며 열정적인 엔터테이너입니다.",
"strengths": "대담함, 독창적, 실용적, 관찰력",
"weaknesses": "민감함, 갈등 회피, 쉽게 지루함"
}
}
def calculate_mbti(answers):
"""답변을 바탕으로 MBTI 유형 계산"""
scores = {"E": 0, "I": 0, "S": 0, "N": 0, "T": 0, "F": 0, "J": 0, "P": 0}
for i, answer in enumerate(answers):
if answer is None:
continue
question = questions[i]
dimension = question["dimension"]
direction = question["direction"]
# 5점 척도: 1(전혀 아니다) ~ 5(매우 그렇다)
scores[direction] += answer
# MBTI 유형 결정
mbti_type = ""
mbti_type += "E" if scores["E"] > scores["I"] else "I"
mbti_type += "S" if scores["S"] > scores["N"] else "N"
mbti_type += "T" if scores["T"] > scores["F"] else "F"
mbti_type += "J" if scores["J"] > scores["P"] else "P"
return mbti_type, scores
def format_result(mbti_type, scores):
"""결과를 포맷팅"""
info = mbti_descriptions[mbti_type]
result = f"""
# 🎯 당신의 MBTI 유형: {mbti_type}
## {info['title']}
### 📝 설명
{info['description']}
### ✨ 강점
{info['strengths']}
### ⚠️ 약점
{info['weaknesses']}
### 📊 세부 점수
- **외향(E) vs 내향(I)**: E={scores['E']}, I={scores['I']} → **{'E' if scores['E'] > scores['I'] else 'I'}**
- **감각(S) vs 직관(N)**: S={scores['S']}, N={scores['N']} → **{'S' if scores['S'] > scores['N'] else 'N'}**
- **사고(T) vs 감정(F)**: T={scores['T']}, F={scores['F']} → **{'T' if scores['T'] > scores['F'] else 'F'}**
- **판단(J) vs 인식(P)**: J={scores['J']}, P={scores['P']} → **{'J' if scores['J'] > scores['P'] else 'P'}**
"""
return result
def submit_test(*answers):
"""테스트 제출 및 결과 계산"""
if None in answers:
return "⚠️ 모든 질문에 답변해주세요!"
mbti_type, scores = calculate_mbti(answers)
return format_result(mbti_type, scores)
# Gradio 인터페이스 구성
with gr.Blocks(title="MBTI 성격 유형 테스트", theme=gr.themes.Soft()) as demo:
gr.Markdown("""
# 🧠 MBTI 성격 유형 테스트
각 질문에 대해 자신의 성향을 솔직하게 평가해주세요.
**평가 기준:**
- 1 = 전혀 아니다
- 2 = 아니다
- 3 = 보통이다
- 4 = 그렇다
- 5 = 매우 그렇다
""")
# 질문 슬라이더 생성
sliders = []
for i, q in enumerate(questions):
with gr.Row():
slider = gr.Slider(
minimum=1,
maximum=5,
step=1,
value=3,
label=f"질문 {i+1}: {q['text']}",
info="1=전혀 아니다, 5=매우 그렇다"
)
sliders.append(slider)
# 제출 버튼
submit_btn = gr.Button("🎯 결과 확인", variant="primary", size="lg")
# 결과 표시
result_output = gr.Markdown(label="테스트 결과")
# 버튼 클릭 이벤트
submit_btn.click(
fn=submit_test,
inputs=sliders,
outputs=result_output
)
gr.Markdown("""
---
💡 **참고**: 이 테스트는 간단한 MBTI 성향 파악을 위한 것이며, 공식 MBTI 검사를 대체하지 않습니다.
""")
if __name__ == "__main__":
demo.launch(share=True)