본문 바로가기

tkinter

파이썬을 이용하여 독학으로 만들어본 우울증 검사(PHQ-2) 프로그램

반응형

 

안녕하세요~

파이썬을 공부하는 가정의학과 전문의

닥터 배도사입니다. 

 

오늘은 파이썬 tkinter를 이용하여

간단한 우울증 검사 프로그램인 PHQ-2 프로그램을 만들어 보았습니다. 

 

PHQ-2는

"2주 이상 거의 매일 하루 종일 슬프거나, 공허하거나 우울하게 지낸 적이 있습니까?"

" 2주 이상 거의 매일 하루 종이 일이나 취미 혹은 평소에 좋아하던 것들 대부분에 흥미를 잃어버린 적이 있습니까?"

라는 2가지의 질문에 하나라도 "예"라고 대답하면

우울증 가능성이 있다고 판단하여

정밀 검사를 권유하는 방식입니다. 

 

이 검사를 파이썬 tkinter를 이용하여 구연해 보았습니다. 

독학으로 만들어 본 거라 허접하게 그지 없습니다. 

그래도 만들어낸 노력을 보고 끝까지 봐주시면 감사하겠습니다. 

 

 

제가 만든 코드의 전반적인 내용은 위 그림과 같습니다. 

그러면 자세한 내용을 살펴보겠습니다. 

 

import tkinter as tk
from tkinter import ttk

win = tk.Tk()
win.geometry("600x400")
win.resizable(False, False)

 

win = tk.Tk()

윈도우 창을 생성해 줍니다. 

win.geometry("600x400")

윈도우 창 크기를 설정해 줍니다. 

win.resizable(False, False)

윈도우 창의 크기를 고정시켜 줍니다. 

 

def result():
    if int(ent1.get()) + int(ent2.get()) == 2:
        lb10.config(text = "정상입니다.")
    elif int(ent1.get()) + int(ent2.get()) > 2:
        lb10.config(text = "우울증 가능성이 있습니다.")
    else:
        lb10.config(text = "다시입력해 주세요.")

 

앞서 말씀드린 두 가지 질문의 대답에 따라서

우울증 가능성 여부를 판단하는 result라는 함수를 정의해 줍니다. 

 

각각의 질문에 대하여 '아니다'는 1, '그렇다'는 2를 입력하게 됩니다. 

질문 1에 대한 대답은 뒤에서 생성할 Entry(ent1)에 입력하고

질문 2에 대한 대답은 뒤에서 생성할 Entry(ent2)에 입력합니다. 

 

 if int(ent1.get()) + int(ent2.get()) == 2:
        lb10.config(text = "정상입니다.")

 

만약 두 질문 모두 '아니다'인 1을 입력하면 총합인 ent1.get() + ent2.get()이 2가 됩니다. 

즉, 입력한 값의 합이 2가 되면 뒤에서 생성한 lb10에 "정상입니다."를 출력합니다. 

 

elif int(ent1.get()) + int(ent2.get()) > 2:
        lb10.config(text = "우울증 가능성이 있습니다.")

 

만약 두 질문 중 하나라도 '그렇다'인 2를 입력하면 총합인 ent1.get() + ent2.get() 2보다 크게 됩니다. 

즉, 입력한 값의 합이 2보다 크면 뒤에서 생성한 lb10에 "우울증 가능성이 있습니다."를 출력합니다. 

 

 else:
        lb10.config(text = "다시입력해 주세요.")

 

그렇지 않은 값이 입력되었을 경우 

뒤에서 생성한 lb10에 "다시 입력해 주세요."를 출력합니다. 

 

def retry():
    ent1.delete(0, len(ent1.get()))
    ent2.delete(0, len(ent2.get()))
    lb10.config(text="")

 

뒤에서 생상한 "다시 하기" 버튼을 클릭하면

ent1, ent2에 입력한 내용과 lb10에 출력한 내용이 사라지는 함수를 생성합니다. 

 

 

파이썬 PHQ2 검사 프로그램

 

위 사진과 같은 PHQ-2 프로그램을 구성하기 위해

label, entry, button을 이용하여 코드를 짜 줍니다. 

 

# 설문 내용을 label을 이용해 생성
lb1 = tk.Label(win, text = "PHQ-2 설문조사", bg = "yellow")
lb1.grid(row=0, column=0)
lb2 = tk.Label(win, text = "다음 두가지 질문에 답해 주세요.",)
lb2.grid(row=1, column=0, sticky = "w")
lb3 = tk.Label(win, text = "'아니다'면 1, '그렇다'면 2를 기입해 주세요.")
lb3.grid(row=2, column=0, sticky = "w")
lb4 = tk.Label(win)
lb4.grid(row=3, column=0)
lb5 = tk.Label(win, text = "질문 1. 2주 이상 거의 매일 하루 종일 슬프거나,공허하거나 우울하게 지낸적이 있습니까?") 
lb5.grid(row=4, column=0, sticky = "w")
lb6 = tk.Label(win, text = "          1. 아니다, 2. 그렇다")
lb6.grid(row=5, column=0, sticky = "w")
lb7 = tk.Label(win, text = "질문 2. 2주 이상 거의 매일 하루 종이 일이나 취미 혹은 평소에 좋아하던 것들") 
lb7.grid(row=6, column=0, sticky = "w")
lb8 = tk. Label(win, text = "         대부분에 흥미를 잃어버린 적이 있습니까?")
lb8.grid(row=7, column=0, sticky = "w")
lb9 = tk.Label(win, text = "          1. 아니다, 2. 그렇다")
lb9.grid(row=8, column=0, sticky = "w")
lb10 = tk.Label(win)
lb10.grid(row=11, column=0, sticky = "w")

# 질문 1과 2에 대답을 입력하는 Entry 생성
ent1 = tk.Entry(win, width=5)
ent1.grid(row=4, column=1, padx=10)
ent2 = tk.Entry(win, width=5)
ent2.grid(row=7, column=1, padx=10)

# 클릭을 하면 결과가 출력되는 버튼(btn1) 생성
btn1 = tk.Button(win, text = "클릭", command = result)
btn1.grid(row=9, column=0, sticky = "w", padx=10, pady=10)

# 클릭을 하면 입력값과 출력 결과가 사라져 다시 할 수 있는 버튼(btn2) 생성
btn2 = tk.Button(win, text = "다시하기", command = retry)
btn2.grid(row=10, column=0, sticky ="w", padx =10)

 

몇가지 제가 알게 된 문법을 말씀드리겠습니다. 

 

lb2.grid(row=1, column=0, sticky = "w")

grid에 sticky = "w"를 설정하면 label이 왼쪽 정렬을 하게 됩니다. 

만약 sticky = "e"를 설정하면 label이 오른쪽 정렬을 하게 됩니다.

 

본 프로그램은 위에 사진에서 보는 바와 같이

라벨(텍스트)이 모두 왼쪽 정렬이 되어 있는 것을 볼 수 있습니다.  

 

자, 그럼 프로그램을 실행해 보겠습니다. 

 

 

 

질문 1과 질문 2에 '아니다'인 1을 입력하고

클릭을 누르면 "정상입니다"라는 결과가 출력되는 것을 알 수 있습니다. 

 

제가 봐도 상당히 허접한 프로그램으로 보입니다. 

하지만 하나씩 해 나가니 보람을 느낍니다. 

 

계속 만들다 보면 좋은 결과가 있을 것이라고 생각합니다. 

반응형