iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 29
0

依照維基百科,風寒效應是一個很複雜的公式
https://wikimedia.org/api/rest_v1/media/math/render/svg/270da7732a4412876749fc48e5733aca7232b518

我們要將這個函式寫在昨天程式碼中 calc(temp,wind) 的區塊中,讓電腦為我們做風寒指數的計算,要注意的是這邊有一個 global WindChillIndex 這個宣告,這代表說我們告訴 Python 我們接下來要用的是全域變數中的 WindChillIndex,而不是創建一個區域變數,這樣才不會混亂。接著經過轉型、次方運算、公式代入計算出風寒指數後,後過 ResultVar.set() 指定結果到 ResultVar 中,讓 Label 可以顯示出答案。

def calc(temp,wind):
        V016 = pow(float(wind.get()),0.16)
        global WindChillIndex
        WindChillIndex = 13.12 + (0.6215 * float(temp.get())) - (11.37 * V016) + (0.3965 * float(temp.get()) * V016)
        ResultVar.set("WCI = " + str(WindChillIndex) + "°C")

但會發現有一個小問題,數字太長了超過視窗,所以我們加上 round() 函式讓結果只要顯示到小數點第三位,這樣就不會超出範圍了。

def calc(temp,wind):
        V016 = pow(float(wind.get()),0.16)
        global WindChillIndex
        WindChillIndex = 13.12 + (0.6215 * float(temp.get())) - (11.37 * V016) + (0.3965 * float(temp.get()) * V016)
        ResultVar.set("WCI = " + str(round(WindChillIndex,3)) + "°C")

https://ithelp.ithome.com.tw/upload/images/20191014/20120282soD2DDMkHF.png

到目前為止程式都可以運作了,應該也能正確算出風寒指數,但是我們還缺少最後一個重點,使用者操作保護,使用者呢他們不懂程式設計,他可能會甚麼都沒有輸入就按計算,或是在 Entry 中輸入奇怪的字元去計算,那會發生甚麼事呢?

https://ithelp.ithome.com.tw/upload/images/20191015/201202826sHFthOEBY.png

會這樣。 噴錯,程式崩潰。
所以為了這樣的情形發生,我們修改一下 calc(),加上一些檢查,如果發現 Entry 中是空的,就跳出一個警告告訴使用者輸入的數值錯誤,再加上一個 try...catch 區塊在主要轉型與運算的部分,如果使用者輸入奇怪的東西導致例外狀況,也是跳出視窗告知使用者,而不是直接當掉。

def calc(temp,wind):
    #空值檢查
    if(temp.get() == ""):
        tkinter.messagebox.showerror("Error","Temperature value error!")
        return ""
    #空值檢查
    if(wind.get() == ""):
        tkinter.messagebox.showerror("Error","Wind speed value error!")
        return ""
    #例外捕捉
    try:
        V016 = pow(float(wind.get()),0.16)
        global WindChillIndex
        WindChillIndex = 13.12 + (0.6215 * float(temp.get())) - (11.37 * V016) + (0.3965 * float(temp.get()) * V016)
        ResultVar.set("WCI = " + str(round(WindChillIndex,3)) + "°C")
    except Exception as identifier:
        tkinter.messagebox.showerror("Error","Can not finish calculation!")

https://ithelp.ithome.com.tw/upload/images/20191015/20120282FUBgPfsrCk.png

https://ithelp.ithome.com.tw/upload/images/20191015/20120282OgLg9ASnU4.png
我們把所有的程式碼都組合起來,如下:

import tkinter as tk
import tkinter.font as tkFont
import tkinter.messagebox
from math import pow

WindChillIndex = 0

def calc(temp,wind):
    if(temp.get() == ""):
        tkinter.messagebox.showerror("Error","Temperature value error!")
        return ""

    if(wind.get() == ""):
        tkinter.messagebox.showerror("Error","Wind speed value error!")
        return ""
    try:
        V016 = pow(float(wind.get()),0.16)
        global WindChillIndex
        WindChillIndex = 13.12 + (0.6215 * float(temp.get())) - (11.37 * V016) + (0.3965 * float(temp.get()) * V016)
        ResultVar.set("WCI = " + str(round(WindChillIndex,3)) + "°C")
    except Exception as identifier:
        tkinter.messagebox.showerror("Error","Can not finish calculation!")

win = tk.Tk()
win.title("Wind Chill Index calculator")
win.geometry('320x100')
#設定標籤
tk.Label(win,text = "Temperature:").grid(column=0, row=0, sticky="W", padx=10)

tempVar = tk.StringVar()
tempEntry = tk.Entry(win, width=20, textvariable=tempVar).grid(column=0, row=1, padx=10)

#設定標籤
tk.Label(win,text = "Wind Speed:").grid(column=0, row=2, sticky="w", padx=10)

windVar = tk.StringVar()
windEntry = tk.Entry(win, width=20, textvariable=windVar).grid(column=0, row=3, padx=10)

ResultVar = tk.StringVar()
ResultVar.set("WCI = None")
ResultLabel = tk.Label(win,textvariable = ResultVar,font=tkFont.Font(family='consolas', size=12)).grid(column=1, row=1, padx=10)

CalcButton = tk.Button(win, text="Calculate",width=15, height=1, command=lambda temp=tempVar,wind=windVar: calc(temp,wind))
CalcButton.grid(column=1, row=3, padx=10)

win.mainloop()

最後我們利用 pyinstaller 包裝成 EXE 檔,以便發行,因為我們是視窗程式,所以這次指定不要顯示命令列僅顯示視窗的 -w 指令

pyinstaller -F "Wind Chill Index calculator.py" -w --icon=calculator.ico
#ICO from https://icon-icons.com/download/53152/ICO/128/

https://ithelp.ithome.com.tw/upload/images/20191015/20120282kEfsIxfq5U.png

成品我有放在 GitHub 上面,可以給大家參考參考:https://github.com/oxygen-TW/WindChillIndexCalculator/tree/master/Python

參考資料
https://stackoverflow.com/questions/4140437/interactively-validating-entry-widget-content-in-tkinter
https://morvanzhou.github.io/tutorials/python-basic/tkinter/2-10-messagebox/
https://stackoverflow.com/questions/29774938/tkinter-messagebox-showinfo-doesnt-always-work


上一篇
Day28-Build python GUI using tkinter
下一篇
Day30-輪到你了!開始一個專案吧
系列文
原來電腦可以這樣用!? 果蠅也懂的程式語言教學30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言