| import gradio as gr |
|
|
| |
| questions = [ |
| |
| {"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"}, |
| |
| |
| {"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"}, |
| |
| |
| {"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"}, |
| |
| |
| {"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_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"] |
| |
| |
| scores[direction] += answer |
| |
| |
| 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) |
|
|
| |
| 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) |