본문 바로가기
코딩 연습/파이썬 기초(예제)

bmi 계산하기 - 한국인의 체질량 지수 계산 [파이썬기초예제]

by good4me 2022. 4. 20.

goodthings4me.tistory.com

BMI (body mass index)는 체질량 지수 즉, 사람의 비만도를 나타내는 지수이며, 체중과 키의 관계로 자신의 몸무게(kg)를 키의 제곱(m)으로 나눈 값이다. 파이썬으로 한국인의 체질량 지수 계산 프로그램을 구현해보자.

 

 

한국인의 체질량 지수(BMI) 계산 프로그램 구현

BMI 기준

대한비만학회는 한국인의 체질량 지수를 다음과 같은 수치 구간별로 나눈다.

  • 고도 비만 : 35 이상
  • 중(重)도 비만 (2단계 비만) : 30 - 34.9
  • 경도 비만 (1단계 비만) : 25 - 29.9
  • 과체중 : 23 - 24.9
  • 정상 : 18.5 - 22.9
  • 저체중 : 18.5 미만

 

※ BMI 계산하기 2가지 소스 코드 공유

1. 파이썬 소스 코드

2. 파이썬 GUI(Tkinter) 소스 코드

 

[파이썬 소스 코드]

## BMI(body mass index) 체질량 지수 구하기

def bmi():
    name = input('\n이름을 입력하시오(종료:"0")>> ')
    while True:
        try:
            height = float(input('\n키(cm)를 입력하시오(종료:"0")>> '))
        except:
            print('숫자(정수 또는 실수)를 입력하세요!')
            continue

        if height < 0 or height > 250:
            print('키 입력 범위가 아닙니다!')
            continue

        if not height:
            print('\n프로그램을 종료합니다.')
            return False
        break

    while True:
        try:
            weight = float(input('\n몸무게(kg)를 입력하시오(종료:"0")>> '))
        except:
            print('숫자(정수 또는 실수)를 입력하세요!')
            continue

        if weight < 0 or weight > 300:
            print('몸무게 입력 범위가 아닙니다!')
            continue

        if not weight:
            print('\n프로그램을 종료합니다.')
            return False
        break
    
    if name and height and weight:
        bmi = weight/((height/100) * (height/100))
        # print(bmi)
        print(f'\n{"=" * 10} BMI 지수 {"=" * 10}\n')

        if bmi >= 35.0:
            print(f'{name} 님의 BMI 지수는 {bmi:.1f}, 고도 비만 단계입니다.')
        elif 30.0 <= bmi < 34.9:
            print(f'{name} 님의 BMI 지수는 {bmi:.1f}, 중(重)도 비만(2단계 비만) 단계입니다.')
        elif 25.0 <= bmi < 29.9:
            print(f'{name} 님의 BMI 지수는 {bmi:.1f}, 경도 비만(1단계 비만) 단계입니다.')
        elif 23.0 <= bmi < 24.9:
            print(f'{name} 님의 BMI 지수는 {bmi:.1f}, 과체중 단계입니다.')
        elif 18.5 <= bmi < 22.9:
            print(f'{name} 님의 BMI 지수는 {bmi:.1f}, 정상 체중 단계입니다.')
        elif bmi < 18.5:
            print(f'{name} 님의 BMI 지수는 {bmi:.1f}, 저체중 단계입니다.')
    else:
        return False

bmi()
  • BMI 계산에 필요한 키와 몸무게를 각각 입력받을 때 실수로 잘 못 입력했더라도 처음부터 모든 데이터를 입력받지 않고 그 항목만을 다시 입력받기 위해서 while문을 2개로 구분했다.
  • 또한 정수나 실수가 아닌 문자나 특수문자 등 입력을 방지하기 위해 예외처리(try ~ except)를 했고, "0"을 입력하면 프로그램을 종료시킨다.
  • 그리고, 몸무게나 키의 경우 0 미만 값이나 사람의 몸무게, 키를 벗어난 수치(몸무게는 300kg 초과, 키는 250cm 초과)일 경우 다시 입력해야 한다.
  • BMI, 체질량지수는 자신의 몸무게(kg)를 키의 제곱(m)으로 나눈 값이기 때문에 키의 경우 cm로 입력받고, 계산식에서는 100으로 나눈값을 적용했다.
  • 계산식과 BMI 결과 출력 시 if 문으로 구현하고 수치는 소수점 첫째 자리까지 표시한다.

 

good4me.co.kr

 

[실행 결과]

이름을 입력하시오(종료:"0")>> 홍길동

키(cm)를 입력하시오(종료:"0")>> 180.5

몸무게(kg)를 입력하시오(종료:"0")>> 77.2

========== BMI 지수 ==========

홍길동 님의 BMI 지수는 23.7, 과체중 단계입니다.

 

 

[파이썬 GUI(Tkinter) 소스코드]

from tkinter import *
from tkinter import messagebox

root = Tk()
root.title('BMI 계산하기')
root.geometry('450x430+500+100')
root.resizable(False, False)
root.option_add('*Font','맑은고딕 12')


def bmi(height, weight):
    result = ''
    bmi = weight/((height/100) * (height/100))
    # print(bmi)
    print(f'\n{"=" * 10} BMI 지수 {"=" * 10}\n')

    if bmi >= 35.0:
        print(f'당신의 BMI 지수는 {bmi:.1f}, 고도 비만 단계입니다.')
        result = f'당신의 BMI 지수는 {bmi:.1f}, 고도 비만 단계입니다.'
    elif 30.0 <= bmi < 34.9:
        print(f'당신의 BMI 지수는 {bmi:.1f}, 중(重)도 비만(2단계 비만) 단계입니다.')
        result = f'당신의 BMI 지수는 {bmi:.1f}, 중(重)도 비만(2단계 비만) 단계입니다.'
    elif 25.0 <= bmi < 29.9:
        print(f'당신의 BMI 지수는 {bmi:.1f}, 경도 비만(1단계 비만) 단계입니다.')
        result = f'당신의 BMI 지수는 {bmi:.1f}, 경도 비만(1단계 비만) 단계입니다.'
    elif 23.0 <= bmi < 24.9:
        print(f'당신의 BMI 지수는 {bmi:.1f}, 과체중 단계입니다.')
        result = f'당신의 BMI 지수는 {bmi:.1f}, 과체중 단계입니다.'
    elif 18.5 <= bmi < 22.9:
        print(f'당신의 BMI 지수는 {bmi:.1f}, 정상 체중 단계입니다.')
        result = f'당신의 BMI 지수는 {bmi:.1f}, 정상 체중 단계입니다.'
    elif bmi < 18.5:
        print(f'당신의 BMI 지수는 {bmi:.1f}, 저체중 단계입니다.')
        result = f'당신의 BMI 지수는 {bmi:.1f}, 저체중 단계입니다.'
    return result


def start():
    height = height_entry1.get().strip()
    weight = weight_entry1.get().strip()

    try:
        height = float(height)
        weight = float(weight)

        if height <= 0 or height > 250:
            print('키 입력 범위가 아닙니다!')
            messagebox.showinfo(title='키', message='키 입력 범위가 아닙니다!')
            return False
        if weight <= 0 or weight > 300:
            print('몸무게 입력 범위가 아닙니다!')
            messagebox.showinfo(title='몸무게', message='몸무게 입력 범위가 아닙니다!')
            return False
    except:
        print('키와 몸무게는 숫자를 입력하세요!')
        messagebox.showinfo(title='키/몸무게', message='키와 몸무게는 숫자(양수)를 입력하세요!')
        return False

    result = bmi(height, weight)
    result_lbl2.config(text=result)


def set_default():
    height_entry1.delete(0, END)
    weight_entry1.delete(0, END)
    result_lbl2.config(text='')


## 타이틀
title_lbl = Label(root, text='한국인의 체질량 지수(BMI) 계산하기', font=('맑은고딕', 17, 'bold'))
title_lbl.grid(row=1, column=0, columnspan=4, pady=20)

## 입력 프레임
bmi_lbl_frame = LabelFrame(root, text='데이터 입력')
bmi_lbl_frame.grid(row=2, column=0, columnspan=4, padx=17)

## 키
height_lbl1 = Label(bmi_lbl_frame, text='키(cm):', width=6, font=('맑은고딕', 13))
height_lbl1.grid(row=3, column=0, padx=10, pady=10)

height_entry1 = Entry(bmi_lbl_frame, width=10, bg='powderblue', fg='red')
height_entry1.grid(row=3, column=1, pady=10, sticky='w', padx=12, ipady=3)

## 몸무게
weight_lbl1 = Label(bmi_lbl_frame, text='몸무게(kg):', width=10, font=('맑은고딕', 13))
weight_lbl1.grid(row=3, column=2, padx=10, pady=10)

weight_entry1 = Entry(bmi_lbl_frame, width=10, bg='powderblue', fg='red')
weight_entry1.grid(row=3, column=3, pady=10, sticky='w', padx=12, ipady=3)

## 버튼
btn_frame1 = Frame(bmi_lbl_frame)
btn_frame1.grid(row=4, column=0, columnspan=4, padx=10)

btn_save1 = Button(btn_frame1, text='계산하기', width=10, font=('명조', 11), bg='lightblue', command=start)
btn_save1.grid(row=4, column=0, pady=20, padx=5)

btn_set_default = Button(btn_frame1, text='입력초기화', width=10, font=('명조', 11), bg='lightblue', command=set_default)
btn_set_default.grid(row=4, column=1, pady=20, padx=5)


######### BMI 결과 ##########

## 결과 프레임
result_lbl_frame = LabelFrame(root, text='BMI 결과')
result_lbl_frame.grid(row=6, column=0, columnspan=4, pady=20, padx=17)

## 결과
result_lbl2 = Label(result_lbl_frame, text='', width=38, height=3, font=('맑은고딕', 13, 'bold'), fg='blue', wraplength=250)  # wraplength 줄바꿈 처리
result_lbl2.grid(row=6, column=0, padx=10, pady=5)

root.mainloop()
  • 파이썬 GUI 모듈 Tkinter를 활용하여 만든 프로그램

 

아래 이미지 관련 프로그램 다운로드(pyinstaller로 만든 실행 파일)

 

 

[실행 결과]

BMI tkinter UI
BMI tkinter UI

 

댓글