Python - BMI 계산기

codeamor·2020년 6월 27일
0

Python

목록 보기
2/4

🔸 Tkinter

파이썬에 내장되어 있는 Tkinter 모듈을 통해 간단한 GUI 형식의 계산기를 만들 수 있다.

✔ Tkinter 실행

from tkinter import *
window = Tk()  # 윈도우 생성
window.mainloop()  # 실행(루프 생성)

위 코드를 입력하면 빈 공간이 실행된다.

여기에 코드들을 추가하여 계산기의 기능과 시각적 요소들을 넣어주면 된다.


from tkinter import *
window = Tk()  # 윈도우 생성

# label 에 텍스트를 넣어 정보를 표시한다.
l1 = Label(window, text = "입력")
l1.pack()

# entry로 입력받을 수 있는 공간을 지정한다.
e1 = Entry(window)
e1.pack()

# button으로 다음 동작을 이어나갈 수 있도록 한다.
b1 = Button(window, text = "확인")
b1.pack()

window.mainloop()

위의 결과는 아래와 같다


* BMI 공식


✔ 계산기 기능 구현

  • 계산기에 필요한 기능
    • 사용자의 키와 체중 정보를 입력받는다.
    • BMI 공식을 계산한다
    • 저체중 ~ 비만까지의 비만도를 판단한다.
    • 결과를 출력한다.

  • 계산기에 필요한 요소
    • 입력 창 2개
    • 출력 창 1개
    • 입력된 정보 계산 버튼
    • 입력된 정보 리셋 버튼

필요한 기능과 요소를 생각하며 아래 코드를 작성한다.

from tkinter import *
window = Tk()
window.geometry('300x200')  # 창 크기 지정
# 창 크기 변경 못하도록 설정
window.resizable(width=False, height=False)

# Label 로 프로그램 안내하는 정보 출력, place로 위치 고정
l1 = Label(window, text = "BMI 계산기")
l2 = Label(window, text = "키: ")
l3 = Label(window, text = "체중: ")
l4 = Label(window, text = "나의 체질량지수(BMI): ")
l5 = Label(window, text = "m")
l6 = Label(window, text = "kg")

# .pack() 대신 .place(x, y)를 이용하면 원하는 위치에 위치시킬 수 있다.
l1.place(x=5, y=10)
l2.place(x=20, y=50)
l3.place(x=20, y=80)
l4.place(x=10, y=160)
l5.place(x=230, y=50)
l6.place(x=230, y=80)

# 입출력 칸을 Entry로 생성, place로 위치 고정
e1 = Entry(window)
e2 = Entry(window)
e3 = Entry(window)
e1.place(x=75, y=50)
e2.place(x=75, y=80)
e3.place(x=140, y=160)

# 계산하기, 다시하기 버튼 생성 및 이벤트 처리, place로 위치 고정
b1 = Button(window, text = "계산하기")
b2 = Button(window, text = "다시하기")
b1.place(x=140, y=115)
b2.place(x=225, y=115)

window.mainloop()
  • 가독성을 위해 tk 창의 크기를 지정했다.
  • 라벨, 엔트리, 그리고 버튼의 위치를 지정했다.
  • .pack() 대신 .place(x, y) 를 사용하면 원하는 위치를 지정할 수 있다.

코드를 실행하면 아래의 결과가 나온다.



✔ 이벤트 구현

  • 버튼을 눌렀을 때 이벤트를 주어서 기능을 수행한다.

  • 계산하기 를 누르면 입력 값을 읽고, 계산을 수행하고, 결과를 표시해야 한다.

  • 다시하기 를 누르면 Entry 에 있는 모든 텍스트를 지워준다.

  • 이벤트 구현은 함수를 만든 뒤 버튼을 정의할 때 command=(함수 이름)을 넣어준다.


```from tkinter import *

def calculate():  # BMI를 계산하는 함수
    le = float(e1.get())
    we = float(e2.get())
    bmi = we/(le*le)  # BMI 계산
    bmi = round(bmi, 1)  # BMI를 소수점 둘째자리에서 반올림

    bmii = ''  # BMI로 체중상태 판정
    if bmi <= 18.5:
        bmii = '저체중'
    elif bmi < 25:
        bmii = '정상'
    elif bmi < 30:
        bmii = '과체중'
    else:
        bmii = '비만'

    e3.delete(0, len(e3.get()))  # 결과 출력 전 창 비우기
    e3.insert(0, bmii+"(" + str(bmi) + ")")  # 결과 출력

def retry():  # 입출력 창을 초기화 하는 함수
    e1.delete(0, len(e1.get()))
    e2.delete(0, len(e2.get()))
    e3.delete(0, len(e3.get()))

window = Tk()
window.geometry('300x200')  # 창 크기 지정
# 창 크기 변경 못하도록 설정
window.resizable(width=False, height=False)

# Label 로 프로그램 안내하는 정보 출력, place로 위치 고정

# 선언할 때 글자 색상과 폰트를 설정할 수 있다.
l1 = Label(window, text = "BMI 계산기",
	   fg = "orange", font = "helvetica 16 bold")
l2 = Label(window, text = "키: ")
l3 = Label(window, text = "체중: ")
l4 = Label(window, text = "나의 체질량지수(BMI): ")
l5 = Label(window, text = "m")
l6 = Label(window, text = "kg")

# .pack() 대신 .place(x, y)를 이용하면 원하는 위치에 위치시킬 수 있다.
l1.place(x=5, y=10)
l2.place(x=20, y=50)
l3.place(x=20, y=80)
l4.place(x=10, y=160)
l5.place(x=230, y=50)
l6.place(x=230, y=80)

# 입출력 칸을 Entry로 생성, place로 위치 고정
e1 = Entry(window)
e2 = Entry(window)
e3 = Entry(window)
e1.place(x=75, y=50)
e2.place(x=75, y=80)
e3.place(x=140, y=160)

# 계산하기, 다시하기 버튼 생성 및 이벤트 처리, place로 위치 고정

# 클릭 시 함수 calculate를 실행한다.
b1 = Button(window, text = "계산하기", command=calculate)
# 클릭 시 함수 retry를 실행한다.
b2 = Button(window, text = "다시하기", command=retry)
b1.place(x=140, y=115)
b2.place(x=225, y=115)

window.mainloop()
  • e1.get() 으로 Entry에 있는 텍스트를 읽는다.
  • e1.insert(시작 위치, 텍스트)으로 Entry에 텍스트를 삽입한다.
  • e1.delete(시작 위치, 끝 위치)으로 Entry의 해당 범위 안의 텍스트를 지울 수 있다.

실행하면 아래의 결과 창이 나타난다.



✔ 실제 적용

좋아하는 남자 배우인 김수현의 프로필 정보를 입력해 보았다.
결과는 저체중 직전의 정상 상태이다.
지금 찍는 드라마를 보니 살이 더 빠진 것 같아서 저체중일 것 같다..
아무튼 파이썬은 정말 만능 언어인 것 같다.
지금은 그대로 따라서 코드를 입력해봤지만 여기서 변형해보는 연습을 많이 해봐야겠다.
백지 상태에서 스스로 코딩하지 못하면 내 실력이 아니기 때문에..
웹 크롤링도 해보고 있는데 정리가 되는 대로 올려야겠다!



Reference

https://commonengineerr.tistory.com/7

0개의 댓글