
안녕하세요~
파이썬을 공부하는 가정의학과 전문의
닥터 배도사입니다.
예전에 tkinter를 이용하여
우울증 간이검사(PHQ-2)를 하는 프로그램을 만들어 보았습니다.
그때는 질문에 대한 대답을 Entry에 기입하는 방식으로 만들었었는데요.
이번에는
Radiobutton을 이용하여
PHQ-2 설문을 만들어 보았습니다.
다시 한번 PHQ-2 설문에 대해서 이야기드리면
"2주 이상 거의 매일 하루 종일 슬프거나, 공허하거나 우울하게 지낸 적이 있습니까?"
" 2주 이상 거의 매일 하루 종이 일이나 취미 혹은 평소에 좋아하던 것들 대부분에 흥미를 잃어버린 적이 있습니까?"
라는 2가지의 질문에 하나라도 "예"라고 대답하면
우울증 가능성이 있다고 판단하여
정밀 검사를 권유하는 설문입니다.
이 검사를 파이썬 tkinter, radiobutton을 이용하여 구연해 보았습니다.
독학으로 맨땅에 헤딩하듯이 만들어 본 것이라 허접합니다.
그래도 같이 한번 봐주세요^^
import tkinter as tk from tkinter import * win = tk.Tk() win.title("PHQ-2") win.geometry("600x400") win.resizable(False, False) def result(): if answer.get()+answer1.get() == 0: lb6.config(text = "정상입니다.") elif answer.get()+answer1.get() >= 1: lb6.config(text = "우울증 가능성이 있습니다.") else: lb6.config(text = "다시 입력하십시오.") def retry(): lb6.config(text="") 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) lb3 = tk.Label(win) lb3.grid(row=2, column=0) lb4 = tk.Label(win, text = "질문 1. 2주 이상 거의 매일 하루 종일 슬프거나,공허하거나 우울하게 지낸적이 있습니까?") lb4.grid(row=3, column=0, sticky = "w") lb5 = tk.Label(win, text = "질문 2. 2주 이상 거의 매일 하루 종이 일이나 취미 혹은 평소에 좋아하던 것들\n대부분에 흥미를 잃어버린 적이 있습니까?") lb5.grid(row=6, column=0, sticky = "w") lb6 = tk.Label(win) lb6.grid(row=11, column=0, sticky = "w") answer = tk.IntVar() answer1 = tk.IntVar() rad1 = tk.Radiobutton(win, text = "아니오", variable = answer, value = 0) rad1.grid(row=4, column=0, sticky = "w") rad2 = tk.Radiobutton(win, text = "네", variable = answer, value = 1) rad2.grid(row=5, column=0, sticky = "w") rad3 = tk.Radiobutton(win, text = "아니오", variable = answer1, value = 0) rad3.grid(row=7, column=0, sticky = "w") rad4 = tk.Radiobutton(win, text = "네", variable = answer1, value = 1) rad4.grid(row=8, column=0, sticky = "w") btn1 = tk.Button(win, text = "클릭", command = result) btn1.grid(row=9, column=0, sticky = "w", padx=10, pady=10) btn2 = tk.Button(win, text = "다시하기", command = retry) btn2.grid(row=10, column=0, sticky ="w", padx =10) win.mainloop() |
제가 만든 코드의 전반적인 내용은 위 그림과 같습니다.
그러면 자세한 내용을 살펴보겠습니다.
import tkinter as tk from tkinter import * win = tk.Tk() win.title("PHQ-2") win.geometry("600x400") win.resizable(False, False) |
win = tk.Tk()
윈도우 창을 생성해 줍니다.
win.title("PHQ-2")
윈도우 창의 이름을 PHQ-2로 설정해 줍니다.
win.geometry("600x400")
윈도우 창 크기를 설정해 줍니다.
win.resizable(False, False)
윈도우 창의 크기를 고정시켜 줍니다.
def result(): if answer.get()+answer1.get() == 0: lb6.config(text = "정상입니다.") elif answer.get()+answer1.get() >= 1: lb6.config(text = "우울증 가능성이 있습니다.") else: lb6.config(text = "다시 입력하십시오.") |
앞서 말씀드린 두 가지 질문의 대답에 따라서
우울증 가능성 여부를 판단하는 result라는 함수를 정의해 줍니다.
함수 설명에 앞서 뒤에서 설명드릴
라디오 버튼에 대해 미리 설명드리겠습니다.
질문 1에 대하여 radiobutton1(rad1)인 아니요를 클릭하면 answer라는 변수에 value 값 0이 설정됩니다.
질문 1에 대하여 radiobutton2(rad2)인 예를 클릭하면 answer라는 변수에 value 값 1이 설정됩니다.
질문 2에 대하여 radiobutton3(rad3)인 아니요를 클릭하면 answer1라는 변수에 value 값 0이 설정됩니다.
질문 2에 대하여 radiobutton3(rad3)인 예를 클릭하면 answer1라는 변수에 value 값 1이 설정됩니다.
if answer.get()+answer1.get() == 0:
lb6.config(text = "정상입니다.")
만약 두 질문 모두 '아니다'인 rad1, rad3를 클릭하면
answer.get() + answer1.get() 이 0이 됩니다.
즉, 클릭한 radiobutton의 value가 0이 되면
결과물을 출력하는 라벨인 lb6에 "정상입니다."를 출력합니다.
elif answer.get()+answer1.get() >= 1:
lb6.config(text = "우울증 가능성이 있습니다.")
그렇지 않고 만약 질문 2가지 중 하나라도 '예'인 rad2, rad4를 클릭하면
answer.get() + answer1.get() 이 1보다 크게 됩니다.
즉, 클릭한 radiobutton의 value가 1보다 크게 되면
결과물을 출력하는 라벨인 lb6에 "우울증 가능성이 있습니다."를 출력합니다.
else:
lb6.config(text = "다시 입력하십시오.")
그렇지 않은 값이 입력되었을 경우
뒤에서 생성한 lb6에 "다시 입력해 주세요."를 출력합니다.
def retry(): lb6.config(text="") |
뒤에서 생성한 "다시 하기" 버튼을 클릭하면
lb6에 출력한 내용이 사라지는 함수를 생성합니다.

위 사진과 같은 PHQ-2 프로그램을 구성하기 위해
label, radiobutton, button을 이용하여 코드를 짜 줍니다.
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) lb3 = tk.Label(win) lb3.grid(row=2, column=0) lb4 = tk.Label(win, text = "질문 1. 2주 이상 거의 매일 하루 종일 슬프거나,공허하거나 우울하게 지낸적이 있습니까?") lb4.grid(row=3, column=0, sticky = "w") lb5 = tk.Label(win, text = "질문 2. 2주 이상 거의 매일 하루 종이 일이나 취미 혹은 평소에 좋아하던 것들\n대부분에 흥미를 잃어버린 적이 있습니까?") lb5.grid(row=6, column=0, sticky = "w") lb6 = tk.Label(win) lb6.grid(row=11, column=0, sticky = "w") |
lb1 = tk.Label(win, text = "PHQ-2 설문조사", bg = "yellow")
lb1.grid(row=0, column=0)
'PHQ-2 설문조사'라는 텍스트를 가진 라벨(lb1)을 만들고 배경색을 노란색으로 해 줍니다.
0행, 0열에 위치시킵니다.
lb2 = tk.Label(win, text = "다음 두 가지 질문에 답해 주세요.",)
lb2.grid(row=1, column=0)
'다음 두가지 질문에 답해 주세요'라는 텍스트를 가진 라벨(lb2)을 만듭니다.
1행, 0열에 위치시킵니다.
lb3 = tk.Label(win)
lb3.grid(row=2, column=0)
비어 있는 라벨(lb3)을 만들고 2행 0열에 위치시킵니다.
lb4 = tk.Label(win, text = "질문 1. 2주 이상 거의 매일 하루 종일 슬프거나, 공허하거나 우울하게 지낸 적이 있습니까?")
lb4.grid(row=3, column=0, sticky = "w")
'질문 1. 2주 이상 거의 매일 하루 종일 슬프거나,공허하거나 우울하게 지낸적이 있습니까?'라는 텍스트를 가진 라벨(lb4)을 만듭니다.
3행, 0열에 위치 시키고 왼쪽 정열을 합니다.
lb5 = tk.Label(win, text = "질문 2. 2주 이상 거의 매일 하루 종이 일이나 취미 혹은 평소에 좋아하던 것들\n대부분에 흥미를 잃어버린 적이 있습니까?") lb5.grid(row=6, column=0, sticky = "w")
"질문 2. 2주 이상 거의 매일 하루 종이 일이나 취미 혹은 평소에 좋아하던 것들\n대부분에 흥미를 잃어버린 적이 있습니까?"라는 텍스트를 가진 라벨(lb5)을 만듭니다.
6행, 0열에 위치 시킵키고 왼쪽 정열을 합니다.
lb6 = tk.Label(win)
lb6.grid(row=11, column=0, sticky = "w")
결과가 출력된 비어있는 라벨(lb6)을 만들고
11행, 0열에 위치시킨 후 왼쪽 정열을 합니다.
answer = tk.IntVar() answer1 = tk.IntVar() rad1 = tk.Radiobutton(win, text = "아니오", variable = answer, value = 0) rad1.grid(row=4, column=0, sticky = "w") rad2 = tk.Radiobutton(win, text = "네", variable = answer, value = 1) rad2.grid(row=5, column=0, sticky = "w") rad3 = tk.Radiobutton(win, text = "아니오", variable = answer1, value = 0) rad3.grid(row=7, column=0, sticky = "w") rad4 = tk.Radiobutton(win, text = "네", variable = answer1, value = 1) rad4.grid(row=8, column=0, sticky = "w") |
answer = tk.IntVar()
answer1 = tk.IntVar()
rad1,2의 변수인 answer를 Int로 정의해 줍니다.
rad3,4의 변수인 answer1을 Int로 정의해 줍니다.
rad1 = tk.Radiobutton(win, text = "아니오", variable = answer, value = 0)
rad1.grid(row=4, column=0, sticky = "w")
"아니오"라는 텍스트를 가진 radiobutton(rad1)을 만들어 줍니다.
변수는 answer로 두고 value 값을 0으로 둡니다.
4행, 0열에 위치시키고 왼쪽 정열을 합니다.
rad2 = tk.Radiobutton(win, text = "네", variable = answer, value = 1)
rad2.grid(row=5, column=0, sticky = "w")
"예"라는 텍스트를 가진 radiobutton(rad2)을 만들어 줍니다.
변수는 answer로 두고 value 값을 1로 둡니다.
5행, 0열에 위치시키고 왼쪽 정열을 합니다.
rad3 = tk.Radiobutton(win, text = "아니오", variable = answer1, value = 0)
rad3.grid(row=7, column=0, sticky = "w")
"아니오"라는 텍스트를 가진 radiobutton(rad3)을 만들어 줍니다.
변수는 answer로 두고 value 값을 0으로 둡니다.
7행, 0열에 위치 시키고 왼쪽 정열을 합니다.
rad4 = tk.Radiobutton(win, text = "네", variable = answer1, value = 1)
rad4.grid(row=8, column=0, sticky = "w")
"예"라는 텍스트를 가진 radiobutton(rad4)을 만들어 줍니다.
변수는 answer로 두고 value 값을 1로 둡니다.
8행, 0열에 위치시키고 왼쪽 정열을 합니다.
btn1 = tk.Button(win, text = "클릭", command = result) btn1.grid(row=9, column=0, sticky = "w", padx=10, pady=10) btn2 = tk.Button(win, text = "다시하기", command = retry) btn2.grid(row=10, column=0, sticky ="w", padx =10) win.mainloop() |
btn1 = tk.Button(win, text = "클릭", command = result)
btn1.grid(row=9, column=0, sticky = "w", padx=10, pady=10)
'클릭'이라는 텍스트를 가진 버튼(btn1)을 만들고 앞서 만들 result 함수와 연결시킵니다.
9행, 0열에 위치시킵니다.
btn2 = tk.Button(win, text = "다시 하기", command = retry)
btn2.grid(row=10, column=0, sticky ="w", padx =10)
'다시 하기'는 텍스트를 가진 버튼(btn2)을 만들고 앞서 만들 retry 함수와 연결시킵니다.
10행, 0열에 위치시킵니다.
win.mainloop()
코드가 완성되었습니다.
조금 부족하기는 하지만 한번 실행해 보겠습니다.

사진에서 보시는 바와 같이
질문 1에 '예'를 클릭하고 질문 2에 '아니오'를 클릭하면
'우울증 가능성이 있습니다'라고 출력이 됩니다.
제가 봐도 조금 부족한 부분이 있습니다.
조금 더 공부해서 완성도 있는 프로그램을 만들고 싶습니다.
'tkinter' 카테고리의 다른 글
[tkinter] BMI 계산기 만들기(ver.2) (0) | 2022.07.22 |
---|---|
자기암시 GUI 프로그램 만들기(Tkinter) (0) | 2022.07.21 |
[파이썬 tkinter] Radiobutton 사용하기 (0) | 2021.12.20 |
[파이썬 tkinter] checkbutton 사용하기 (0) | 2021.12.20 |
파이썬을 이용하여 독학으로 만들어본 우울증 검사(PHQ-2) 프로그램 (2) | 2021.12.14 |