Try   HackMD

BMI計算機使用tkinter

安裝需要的模組

Pillow模組:用來載入圖片

pip3 install Pillow

tkinter模組:

MacOS下安裝
$ brew install tcl-tk

tkinter為系統層級的模組,所以無法透過pip來安裝。

Windows下安裝

安裝Anaconda後預設已經安裝tkinter。

測試是否有安裝tkinter模組
$ python3 -m tkinter -c 'tkinter._test()'
tkinter版本
$ python3 -m tkinter -c 'tkinter.TkVersion'

完整程式碼

import tkinter as tk
from PIL import Image, ImageTk
import math

window = tk.Tk()
window.title('BMI App')
window.geometry('600x400')
window.configure(background='white')

# 透過PIL模組開啟圖片
img = Image.open('pic.jpg')  

# 透過PIL模組來建立PhotoImage物件,即可正常載入圖片
photo = ImageTk.PhotoImage(img)

def resize(img2, w, h):
    size = (w, h)
    resized = img.resize(size)
    img2 = ImageTk.PhotoImage(resized)

    return img2

photo = resize(photo, 600, 100)
bk_label = tk.Label(window, image=photo)
# bk_label.config(width='600', height='100')
bk_label.pack(expand=False)

# 計算bmi並顯示結果
def calculate_bmi_number():
    height = float(height_entry.get())
    weight = float(weight_entry.get())
    print(height, weight, math.pow(height, 2))
    bmi_value = round(weight / math.pow(height/100, 2), 2)
    print(bmi_value)

    result = '你的 BMI 指數為:{} {}'.format(bmi_value, get_bmi_status_description(bmi_value))
    result_label.configure(text=result)
    
# 顯示評語
def get_bmi_status_description(bmi_value):
    if bmi_value < 18.5:
        return '體重過輕囉,多吃點!'
    elif bmi_value >= 18.5 and bmi_value < 24:
        return '體重剛剛好,繼續保持!'
    elif bmi_value >= 24 :
        return '體重有點過重囉,少吃多運動!'

# 大標題
header_label = tk.Label(window, text='BMI計算機', font='_ 30')
header_label.pack()

# 身高輸入區域
height_frame = tk.Frame(window)
height_frame.pack(side=tk.TOP, pady=10)

# 身高文字標籤
height_label = tk.Label(height_frame, text='身高(m)', font='_ 30')
height_label.pack(side=tk.LEFT)

# 身高輸入框
height_entry = tk.Entry(height_frame, font='_ 30')
height_entry.insert(0, '0')
height_entry.pack(side=tk.LEFT)

# 體重輸入區域
weight_frame = tk.Frame(window)
weight_frame.pack(side=tk.TOP)

# 體重文字標籤
weight_label = tk.Label(weight_frame, text='體重(kg)', font='_ 30', foreground='black', bg='white')
weight_label.pack(side=tk.LEFT)

# 體重輸入框
weight_entry = tk.Entry(weight_frame, font='_ 30')
weight_entry.insert(0, '0')
weight_entry.pack(side=tk.LEFT)

# 顯示計算結果的label
result_label = tk.Label(window, font='_ 20')
result_label.pack()

# 計算按鈕
calculate_btn = tk.Button(window, text='馬上計算', command=calculate_bmi_number, font='_ 20', foreground='#00ff00', background='blue')
calculate_btn.pack()

window.mainloop()

注意:
為了載入圖片,程式碼目錄下必須有一個pic.jpg圖片檔案存在。