import gradio as gr # 질문 리스트 (20개 이상의 질문) questions = [ "자신을 외향적인 사람이라고 생각합니까?", "계획을 세우기보다 즉흥적으로 행동하는 편입니까?", "논리적인 이유보다 감정에 더 자주 이끌립니까?", "일정을 엄격하게 관리하는 편입니까?", "대화를 주도하는 편입니까?", "세부사항보다 전체적인 큰 그림을 더 중시합니까?", "갈등 상황에서 피하려는 경향이 있습니까?", "다른 사람의 감정을 쉽게 파악합니까?", "문제를 해결할 때 이성적으로 접근합니까?", "많은 사람들과 시간을 보내는 것을 즐깁니까?", "미래보다는 현재에 집중하는 편입니까?", "규칙과 절차를 따르는 것을 중요하게 생각합니까?", "불확실한 상황에서 스트레스를 느낍니까?", "다른 사람에게 조언을 주는 것을 좋아합니까?", "결정을 내릴 때 감정을 더 중요하게 생각합니까?", "자신의 감정을 잘 통제합니까?", "새로운 아이디어에 쉽게 흥미를 느낍니까?", "팀 프로젝트에서 주도적으로 일합니까?", "복잡한 문제를 단순화하려고 노력합니까?", "시간을 잘 관리합니까?", "모험적인 결정을 내리기 전에 신중하게 생각합니까?" ] # 응답을 바탕으로 MBTI 유형을 계산하는 함수 def calculate_mbti(responses): e_i = sum([1 if resp == "Yes" else 0 for i, resp in enumerate(responses) if i % 4 == 0]) s_n = sum([1 if resp == "Yes" else 0 for i, resp in enumerate(responses) if i % 4 == 1]) t_f = sum([1 if resp == "Yes" else 0 for i, resp in enumerate(responses) if i % 4 == 2]) j_p = sum([1 if resp == "Yes" else 0 for i, resp in enumerate(responses) if i % 4 == 3]) total = len(responses) // 4 mbti = ( ("E" if e_i > total / 2 else "I") + ("S" if s_n > total / 2 else "N") + ("T" if t_f > total / 2 else "F") + ("J" if j_p > total / 2 else "P") ) return mbti, e_i / total * 100, s_n / total * 100, t_f / total * 100, j_p / total * 100 # MBTI 결과에 따른 성격, 직업 추천, 유명인, 잘 맞는/맞지 않는 MBTI 추천 def get_mbti_description(mbti_type): descriptions = { "INTJ": ( "전략적이며 계획적인 성향을 가지고 있으며, 분석적 사고가 뛰어납니다.", ["엔지니어", "과학자"], ["일론 머스크", "마리 퀴리"], ["ENTP", "INTP"], ["ESFP", "ENFP"] ), "ENTP": ( "혁신적이며, 새로운 아이디어를 추구합니다.", ["기업가", "마케팅 전문가"], ["토머스 에디슨", "레오나르도 다빈치"], ["INTJ", "INFJ"], ["ISFJ", "ISTJ"] ), "INFJ": ( "이상적이며, 사람들을 도우려는 경향이 강합니다.", ["상담사", "작가"], ["마더 테레사", "넬슨 만델라"], ["ENFP", "ENTP"], ["ESTP", "ESFP"] ), "ENFP": ( "열정적이며 창의적인 성향을 가지고 있습니다.", ["예술가", "마케팅 전문가"], ["로빈 윌리엄스", "드류 배리모어"], ["INFJ", "INTJ"], ["ISTJ", "ISFJ"] ), "ISTJ": ( "책임감이 강하고, 사실에 근거한 결정을 선호합니다.", ["공무원", "회계사"], ["조지 워싱턴", "재클린 케네디"], ["ESTP", "ENTP"], ["ENFP", "ESFP"] ), "ESTJ": ( "조직적이고 실용적인 성향을 가지고 있습니다.", ["관리자", "경영자"], ["프랭클린 D. 루즈벨트", "제프 베조스"], ["ISTJ", "ISFJ"], ["INFP", "INFJ"] ), "ISFJ": ( "다른 사람을 돕는 것을 중요시하며, 신뢰성이 높습니다.", ["간호사", "교사"], ["마더 테레사", "비욘세"], ["ESTJ", "ESFJ"], ["ENTP", "ENFP"] ), "ESFJ": ( "사회적이며, 협력적인 성향이 강합니다.", ["교사", "간호사"], ["테일러 스위프트", "샤키라"], ["ISFJ", "ISTJ"], ["INTP", "ISTP"] ), # 추가 MBTI 유형에 대한 설명을 여기에 계속 추가... } # 기본 값을 설정하여 모든 MBTI 유형에 대해 내용이 나오도록 설정 if mbti_type not in descriptions: description = "이 유형에 대한 기본 설명입니다. 추가적인 정보가 필요합니다." jobs = ["기본 직업 1", "기본 직업 2"] celebrities = ["기본 유명인 1", "기본 유명인 2"] good_matches = ["기본 잘 맞는 유형 1", "기본 잘 맞는 유형 2"] bad_matches = ["기본 잘 맞지 않는 유형 1", "기본 잘 맞지 않는 유형 2"] else: description, jobs, celebrities, good_matches, bad_matches = descriptions[mbti_type] return description, jobs, celebrities, good_matches, bad_matches # 애플리케이션 인터페이스 설정 def mbti_app(): with gr.Blocks() as demo: gr.Markdown("# MBTI 분석기") responses = [] for q in questions: responses.append(gr.Radio(label=q, choices=["Yes", "No"])) result_button = gr.Button("결과 확인") result_output = gr.Markdown() def show_results(*responses): mbti, e_percent, s_percent, t_percent, j_percent = calculate_mbti(responses) description, jobs, celebrities, good_matches, bad_matches = get_mbti_description(mbti) return f"**MBTI 유형**: {mbti}\n\n**E/I 비율**: {e_percent:.2f}%\n**S/N 비율**: {s_percent:.2f}%\n**T/F 비율**: {t_percent:.2f}%\n**J/P 비율**: {j_percent:.2f}%\n\n**성격 설명**: {description}\n\n**추천 직업**: {', '.join(jobs)}\n\n**유명인**: {', '.join(celebrities)}\n\n**잘 맞는 MBTI**: {', '.join(good_matches)}\n\n**잘 맞지 않는 MBTI**: {', '.join(bad_matches)}" result_button.click(fn=show_results, inputs=responses, outputs=result_output) return demo if __name__ == "__main__": mbti_app().launch()