본문 바로가기

tkinter

[파이썬 GUI] BMI 계산기 만들기(feat. tkinter)

반응형

 

안녕하세요.

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

닥터 배도사입니다. 

 

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

키와 몸무게를 입력하면

BMI와 그 판정 결과(정상, 과체중, 비만)가

출력되는 프로그램을

만들어 보도록하겠습니다.

 

파이썬  tkinter, BMI 계산 프로그램 만들기

파이썬으로 tkinter 모듈을 사용하여

BMI 계산기를 GUI로 구현하는 

전반적인 코드는 위 사진과 같습니다. 

 

그럼 지금부터 코드를 

구간별로 나누어 상세히 알아보도록 하겠습니다. 

 

import tkinter as tk
from tkinter import ttk

# 윈도우 창 생성
win = tk.Tk()
win.geometry('300x200')
win.resizable(width=False, height=False)

import tkinter as tk
from tkinter import ttk

 

tkinter 모듈을 tk라는 이름으로 불러와 줍니다. 

tkinter에서 향상된 버전인 ttk를 불러옵니다. 

 

win = tk.Tk()
win.geometry('300x200')

윈도우 창을 생성하고 크기를 설정합니다. 

 

win.resizable(width=False, height=False)

크기는 변하지 않게 설정해 줍니다. 

 

# 키와 몸무게를 입력하라는 label과 entry를 만들고
# 결과를 출력하는 label과 entry를 만들고
# grid로 위치를 배열한다.

lb1 = ttk.Label(win, text = "BMI 계산기")
lb1.grid(row=0,column=0)
lb2 = ttk.Label(win, text = "키: ")
lb2.grid(row=1,column=0)
lb3 = ttk.Label(win, text = "체중: ")
lb3.grid(row=2,column=0)
lb4 = ttk.Label(win, text = "나의 체질량지수(BMI): ")
lb4.grid(row=3,column=0)
lb5 = ttk.Label(win, text = "cm")
lb5.grid(row=1,column=2)
lb6 = ttk.Label(win, text = "kg")
lb6.grid(row=2,column=2)

ent1 = ttk.Entry(win)
ent1.grid(row=1, column=1)
ent2 = ttk.Entry(win)
ent2.grid(row=2, column=1)
ent3 = ttk.Entry(win)
ent3.grid(row=3, column=1)

 

lb1 = ttk.Label(win, text = "BMI 계산기")
lb1.grid(row=0,column=0)

 

"BMI 계산기"라는 텍스트를 가진 라벨을 만들어

grid를 이용하여 0행 0열에 위치시킵니다. 

 

lb2 = ttk.Label(win, text = "키: ")
lb2.grid(row=1,column=0)

 

"키:"라는 텍스트를 가진 라벨을 만들어

grid를 이용하여 1행 0열에 위치시킵니다. 

 

lb3 = ttk.Label(win, text = "체중: ")
lb3.grid(row=2,column=0)

 

"체중:"라는 텍스트를 가진 라벨을 만들어

grid를 이용하여 2행 0열에 위치시킵니다. 


lb4 = ttk.Label(win, text = "나의 체질량지수(BMI): ")
lb4.grid(row=3,column=0)

 

"나의 체질량지수(BMI):"라는 텍스트를 가진 라벨을 만들어

grid를 이용하여 3행 0열에 위치시킵니다. 


lb5 = ttk.Label(win, text = "cm")
lb5.grid(row=1,column=2)

 

"cm:"라는 텍스트를 가진 라벨을 만들어

grid를 이용하여 1행 2열에 위치시킵니다. 


lb6 = ttk.Label(win, text = "kg")
lb6.grid(row=2,column=2)

 

"kg"라는 텍스트를 가진 라벨을 만들어

grid를 이용하여 2행 2열에 위치시킵니다.

 

ent1 = ttk.Entry(win)
ent1.grid(row=1, column=1)

 

키(cm)를 입력받는 엔트리를 ent1이라는 변수로 생성하고

grid를 이용하여 1행 1열에 위치시킵니다. 

 

ent2 = ttk.Entry(win)
ent2.grid(row=2, column=1)

 

몸무게(kg)를 입력받는 엔트리를 ent2이라는 변수로 생성하고

grid를 이용하여 1행 1열에 위치 시킵니다. 

 

ent3 = ttk.Entry(win)
ent3.grid(row=3, column=1)

 

결과(bmi 결과와 판정)를 입력받는 엔트리를 ent3이라는 변수로 생성하고

grid를 이용하여 1행 1열에 위치시킵니다. 

 

# ent1,2에서 입력받은 키와 몸무게의 갑을 가지고
# BMI를 계산하고
# 결과를 판정하며
# 그 결과를 ent3으로 출력하는 함수

def bmi_cal():  
    height = float(ent1.get())
    weight = float(ent2.get())
    bmi = weight/((height/100)**2)  
    bmi = round(bmi, 1)  

    if bmi <= 18.5:
        bmi_result = '저체중'
    elif bmi < 25:
        bmi_result = '정상'
    elif bmi < 30:
        bmi_result = '과체중'
    else:
        bmi_result = '비만'

    ent3.insert(0, bmi_result + "(" + str(bmi) + ")")  # 결과 출력

 

ent1, 2에서 입력받은 키와 몸무게의 갑을 가지고

BMI를 계산하고 결과를 판정하여 그 결과를 ent3에 출력하는 함수를 정의해 줍니다. 

 

def bmi_cal():  

bmi_cal라는 함수를 아래와 같이 정의합니다. 

 

height = float(ent1.get())

height라는 변수에 ent1에 입력한 숫자를 실수형으로 받아 할당합니다. 


weight = float(ent2.get())

weight라는 변수에 ent2에 입력한 숫자를 실수형으로 받아 할당 합니다.


bmi = weight/((height/100)**2)

입력받은 키와 몸무게를 이용하여 공식에 따라 bmi를 계산하여

bmi라는 할당합니다. 

  
bmi = round(bmi, 1) 

bmi 결괏값을 소수점 이하 1자리까지 반올림합니다. 

 

if bmi <= 18.5:
    bmi_result = '저체중'
elif bmi < 25:
    bmi_result = '정상'
elif bmi < 30:
    bmi_result = '과체중'
else:
    bmi_result = '비만'

 

if 구문 이용하여 bmi 결과에 따라

저체중, 정상, 과체중, 비만으로 분류하고

그 결과를 bmi_result라는 변수에 할당합니다. 

 

ent3.insert(0, bmi_result + "(" + str(bmi) + ")")  # 결과 출력

ent1, 2에 입력된 키와 몸무게를 가지고 계산된 bmi, bmi_result를

ent3에 출력해 줍니다. 이때 insert 명령어를 이용해 줍니다. 

 

# ent1,2의 입력값과 ent3의 출력값을 초기화 하는 함수.
def retry():  
    ent1.delete(0, len(ent1.get()))
    ent2.delete(0, len(ent2.get()))
    ent3.delete(0, len(ent3.get()))

 

키와 몸무게를 입력하여 bmi를 구하고 나서

다시 키와 몸무게를 입력하기 위해서는 

기존에 입력했던 수치와 결과를 삭제하여 reset 하는 것이 필요합니다. 

 

이러한 동작을 retry()라는 함수로 정의해 줍니다. 

 

def retry():  
    ent1.delete(0, len(ent1.get()))
    ent2.delete(0, len(ent2.get()))
    ent3.delete(0, len(ent3.get()))

 

retry 함수를 실행하면

ent1, 2, 3에 입력한 숫자의 길이만큼 삭제해 줍니다. 

 

# button을 만들어 클릭 시 함수 bmi_cal이 실행되도록 한다.
btn1 = ttk.Button(win, text = "계산하기", command=bmi_cal)
btn1.grid(row=4, column=0)

# button을 만들어 클릭 시 함수 retry가 실행되도록 한다. 
btn2 = ttk.Button(win, text = "다시하기", command=retry)
btn2.grid(row=4, column=1)

win.mainloop()

 

버튼을 만들어 클릭했을 때 앞서 만든 bmi_cal, retry 함수가 실행되도록 해줍니다. 

 

btn1 = ttk.Button(win, text = "계산하기", command=bmi_cal)

btn1이라는 버튼을 만듭니다. 계산하기라는 텍스트를 넣고

command 명령어를 이용하여 클릭했을 때 bmi_cal 함수가 시행되게 해 줍니다. 

 

btn1.grid(row=4, column=0)

btn1을 grid를 이용하여 4행 0열에 위치시켜 줍니다. 

 

btn2 = ttk.Button(win, text = "다시하기", command=retry)

btn2이라는 버튼을 만듭니다. 다시하기라는 텍스트를 넣고

command 명령어를 이용하여 클릭했을 때 retry 함수가 시행되게 해 줍니다.

 

btn2.grid(row=4, column=1)

btn2을 grid를 이용하여 4행 1열에 위치시켜 줍니다. 

 

자~ 그럼 프로그램 코딩이 다 완료되었습니다!

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

 

파이썬  tkinter로 만든 BMI 계산기 실행 결과

 

 

bmi 계산 프로그램 싱행 결과

 

동영상에서 보시는 바와 같이 

키와 몸무게를 넣는 entry에 키(173) cm와 몸무게(70) kg를 입력하고 계산하기를 누르면

그 결과로써 bmi 22.9, 정상 판정이 나오는 것을 확인할 수 있습니다. 

 

다시하기를 누르면 입력창이 빈칸이 되며

키와 몸무게를 입력 한 후 계산하기를 누르면 bmi가 계산이 됩니다.

 

간단하지만 스스로 bmi 계산 프로그램을 GUI로 구현했다는 사실이 기쁩니다.

앞으로도 계속 공부하여 내가 생각하는 프로그램을

만들어 보고자 합니다!

 

파이팅~!!!

반응형