반응형
안녕하세요. 코딩을 공부하는 의사, 닥터 배입니다.
지난 번에 tkinter를 이용하여 bmi 계산기를 만들어 보았는데요.
기능은 하는데 모양이 이쁘지 않더라구요!
그래서 문법을 조금 더 공부를 해서
frame을 이용하여 좀 더 보기 좋게
BMI 계산기를 만들어 보았습니다.
위 사진에서 보는 것과 같이
위에서 부터 아래로 4개의 프레임을 만들어 계산기를 만들었습니다.
구체적으로 이 BMI 계산기의 프레임은
위에서 부터 아래로 다음 4개의 프레임으로 구성되어 있습니다.
BMI 계산기 제목이 있는 프레임.
키와 몸무게를 입력하는 프레임.
결과가 나오는 프레임.
BMI 결과 기준치 설명이 있는 프레임.
프레임을 구분하면 각 프레임마다
pack, grid를 알맞게 사용할 수 있어 위젯들을 배치하기가 편한 느낌이 있었습니다.
<코드>
import tkinter as tk
from tkinter import *
win = tk.Tk()
win.title("BMI 계산기")
win.geometry("400x350")
# 버튼을 눌렀을 때 입력한 키와 몸무게의 값을 get 하여 BMI를 계산하고 그 결과를 출력하는 함수를 만듭니다.
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 = "비만"
lb5.config(text = bmi_result + "(" + str(bmi) + ")")
# 다시하기 버튼을 눌렀을 때 기존에 입력했던 entry 값들과 결과 출력 값이 삭제되는 함수를 만듭니다.
def retry():
ent1.delete(0, len(ent1.get()))
ent2.delete(0, len(ent2.get()))
lb5.config(text = "")
# 상단 프레임(frame_top)을 만듭니다.
# 상단 프레임에는 label을 이용하여 "BMI 계산기"라는 텍스트를 표시합니다.
# 상단 프레임의 label은 pack을 이용하여 배치합니다.
frame_top = tk.Frame(win)
frame_top.pack(side="top", fill="both")
lb1 = tk.Label(frame_top,text = "BMI 계산기", bg ="yellow")
lb1.pack(side="top", fill="both")
# 중간 프레임(frame_mid)을 만듭니다.
# 준간 프레임에는 label과 entry를 이용하여 키와 몸무게를 입력하는 위젯을 만듭니다.
# "확인" 버튼을 만들어 클릭하면 앞서 만든 bmi_cal 함수가 실행되도록 해 줍니다.
# "다시하기" 버튼을 만들어 클릭하면 앞서 만든 retry 함수가 실행되도록 해 줍니다.
# 중간 프레임의 label, button, entry은 grid를 이용하여 배치합니다.
frame_mid = tk.Frame(win)
frame_mid.pack(side="top", fill="both")
lb2 = tk.Label(frame_mid, text = "키를 입력하세요(cm)")
lb2.grid(row=0, column=0, sticky = "w")
lb3 = tk.Label(frame_mid, text = "몸무게를 입력하세요(kg)")
lb3.grid(row=1, column=0, sticky = "w")
ent1 = tk.Entry(frame_mid)
ent1.grid(row=0, column=1)
ent2 = tk.Entry(frame_mid)
ent2.grid(row=1, column=1)
btn1 = tk.Button(frame_mid, text = "확인", command = bmi_cal)
btn1.grid(row=1, column=2, sticky ="w")
btn2 = tk.Button(frame_mid, text = "다시하기", command = retry)
btn2.grid(row=1, column=3, sticky="w")
# 하단 프레임(frame_bot)은 결과를 나타내는 label을 배치합니다.
# 하단 프레임(frame_bot)의 label은 grid()를 이용하여 배치합니다.
frame_bot = tk.Frame(win, relief="solid", bd=1)
frame_bot.pack(side="top", fill="both")
lb4 = tk.Label(frame_bot, text = "결과:")
lb4.grid(row=0, column=0, sticky = "w")
lb5 = tk.Label(frame_bot, text = "")
lb5.grid(row=0, column=1, sticky = "w")
# 마지막 프레임(frame_fin)은 label을 이용하여 bmi 결과치에 대한 설명을 나타냅니다.
# 마지막 프레임(frame_fin)의 label은 pack으로 배치합니다.
frame_fin = tk.Frame(win)
frame_fin.pack(side="top", fill="both")
lb6 = tk.Label(frame_fin, text = "BMI 해석", bg ="yellow")
lb7 = tk.Label(frame_fin, text= "0~18.4: 저체중")
lb8 = tk.Label(frame_fin, text= "18.5~25: 정상")
lb9 = tk.Label(frame_fin, text= "25~30: 과체중")
lb10 = tk.Label(frame_fin, text= "30~: 비만")
lb6.pack(side="top", anchor ="w")
lb7.pack(side="top", anchor ="w")
lb8.pack(side="top", anchor ="w")
lb9.pack(side="top", anchor ="w")
lb10.pack(side="top", anchor ="w")
win.mainloop()
<결과>
반응형
'tkinter' 카테고리의 다른 글
위젯 배치 - pack() (0) | 2022.07.25 |
---|---|
Tkinter 기본 위젯 종류 (0) | 2022.07.23 |
자기암시 GUI 프로그램 만들기(Tkinter) (0) | 2022.07.21 |
파이썬 tkinter, 우울증 간이검사 설문지 만들어 보기(feat. radiobutton) (0) | 2021.12.21 |
[파이썬 tkinter] Radiobutton 사용하기 (0) | 2021.12.20 |