본문 바로가기
공대생/무작정 해보는 파이썬

Python Tkinter - BMI 계산기 만들기

by 흔한 공대생 2020. 4. 1.
728x90
반응형


 

Tkinter 소개

 일반적으로, python idle을 이용하여 코딩 후 실행시키면 명령 프롬프트 창에서 실행된다. 검은 배경에 까만 글자만 가득한 화면이 이상하다고 느낄 수도 있고, 무엇보다 사용자는 정해진 순서대로만 프로그램을 이용할 수밖에 없다.

 

 예를 들어 계산기 프로그램을 만들었다고 하자. 사용자는 프로그래머가 정한 규칙에 맞추어 값을 입력해야 한다. 숫자를 입력하고, 연산 부호를 입력하고, 또 숫자를 입력해야 하는 규칙 말이다. 그러면 프로그램의 자유도가 떨어지고 사용자가 이용하려고 하지 않을 것이다.

 

 그래서 필요한 것이 GUI(Graphical User Interface)다. Tkinter는 파이썬에 기본으로 포함되어 있는 툴로, 간단하게 GUI를 구현할 수 있다. 물론 오래되어 보이고 예쁘지 않다는 단점이 있지만, 쉽게 다룰 수 있다는 점에만 집중하자.


 

Tkinter 기본적인 실행

 Tk툴을 이용하기 위해서는 다음과 같이 tkinter를 import하고 루프를 생성해주어야 한다.

 

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

 

 위 코드를 실행하면 빈 공간이 생성된다. 이제 코드를 추가로 작성하여 빈 공간을 채워 넣으면 된다.

 

from tkinter import *

window = Tk()

l1 = Label(window, text = '입력')
l1.pack()

e1 = Entry(window)
e1.pack()

b1 = Button(window, text = "확인")
b1.pack()

window.mainloop()

 

 위 코드를 실행하면 다음과 같이 나올 것이다.

 

 

 label에 텍스트를 넣어 정보를 표시하도록 했으며, entry로 입력받을 수 있는 공간을 지정, button으로 다음 동작을 이어나갈 수 있도록 했다.

 

 우리는 함수를 정의해서 버튼을 누를 때 생기는 이벤트를 지정할 수 있으며, entry 창에 있는 정보를 읽거나 쓸 수도 있다. 이 점을 이용하여 bmi 계산기를 만들어보도록 하자.

 BMI 계산법은 단순하다. 아래 그림을 참고하자.

 


 

BMI 계산기 만들기

 BMI 계산기는 다음 기능들이 포함되어야 한다.

  1. 사용자로부터 체중과 키 정보를 입력받는다.
  2. BMI 지수 계산을 진행한다.
  3. 저체중, 정상, 과체중, 비만을 판정한다.
  4. 판정된 결과를 출력한다.

 

 위 조건을 충족시키기 위해 입력 창 두 개와 출력 창 한 개, 계산 버튼 한 개가 필요하다. 사용자의 편의를 위해서 라벨을 이용하여 각종 정보를 표시할 것이고, 리셋 버튼도 추가해보자. 이를 코딩해보자.

 

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')
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좌표)를 이용하면 원하는 위치에 위치시킬 수 있다. 왼쪽 위가 (0, 0)이며 가로가 x, 세로가 y라는 점을 참고하자.

위 코드를 실행시키면 다음 창이 실행된다.

 

 

 이제 버튼을 눌렀을 때 기능을 수행할 수 있도록 이벤트 처리를 하자. 계산하기를 누르면 입력된 신장과 체중을 읽고, 연산을 수행하고, 결과를 표시해야 한다. 다시 하기를 누르면 엔트리에 있는 모든 텍스트를 지워주면 된다.

 이벤트 처리는 함수를 만든 뒤 버튼을 정의할 때 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)

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')
l1.place(x=20, 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)

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)

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

window.mainloop()

 

 e1.get()으로 엔트리에 있는 텍스트를 읽어올 수 있고, e1.insert(시작 위치, 텍스트)으로 엔트리에 텍스트를 삽입, e1.delete(시작 위치, 끝 위치)으로 엔트리의 해당 범위에 있는 텍스트를 지울 수 있다.

 

 추가적으로, 'BMI 계산기'라는 라벨은 제목과도 같은 역할을 수행하기에 강조할 필요를 느꼈다. 라벨을 선언할 때 폰트와 글자 색을 지정해주었다.

 

 실제로 실행시키면 다음과 같은 창이 열린다. 마블 코믹스의 토니 스타크의 BMI를 계산해보자. 키는 185cm, 체중은 102kg으로 알려져 있다.

 

 

 토니 스타크는 곧 비만으로 넘어갈 위험이 다분한, 상당한 과체중임을 알 수 있다.

결과 출력 창에 과체중이라는 문구와 함께 BMI 지수가 표현되는 것을 확인할 수 있다. 다시 하기 버튼도 잘 작동한다. (어떻게 제시해야 할지 모르겠지만..)


 

 이렇게 간단한 코드를 작성하여 BMI 계산기를 만들어보았다.

 코드가 길긴 하지만, 라벨과 엔트리, 버튼을 정의하는데 상당히 많은 줄을 사용했기 때문이다.

 

 Tkinter를 이용하면 이처럼 자신이 원하는 화면을 만들어낼 수 있다.

 다음에는 Tkinter를 이용한 새로운 프로그램을 만들어보고, Tkinter 말고도 GUI를 구현하는 다른 방법을 시도해볼 것이다.

728x90
반응형

댓글