Python Weather App

ผู้เขียนบทความ นายชานน หลีนายน้ำ COE#12

1. ความเป็นมา

แอพพลิเคชั่นสภาพอากาศเป็นแอพพลิเคชั่นที่น่าสนใจและมีผู้ใช้ทั่วทั้งโลก เนื่องจากมันเป็นแอพพลิเคชั่นที่สามารถบอก
สภาพอากาศในช่วงเวลาที่อยากรู้ได้ว่าเป็นอย่างไร ซึ่งอำนวยความสะดวกแก่ผู้คนในหลายๆด้านเช่น การเดินทาง
หากขาดแอพพลิเคชั่นสภาพอากาศไปผู้คนมากมายอาจจะต้องใช้ชีวิตที่ลำบากกว่านี้เพราะไม่มีทางคาดคะเนและหาวิธีรับมือ
ได้เลยว่าสภาพอากาศในอนาคตจะเป็นอย่างไร ซึ่งผมสนใจและสงสัยเกี่ยวกับบางสิ่งบางอย่างในแอพพลิเคชั่นสภาพอากาศ
จึงเริ่มที่จะศึกษาและก็มีแนวคิดขึ้นมาว่าถ้าหากเราสามารถสร้างแอพพลิเคชันสภาพอากาศขึ้นมาใช้เองบ้างมันคงจะดี
เพราะการสร้างบางสิงบางอย่างเป็นวิธีที่จะทำให้เราเข้าใจในสิ่งๆนั้นได้มากที่สุด

2.วัตถุประสงค์

1.เพื่อเรียนรู้ภาษา Pythonใช้สำหรับเขียน Applications สภาพอากาศ

2.เพื่อพัฒนาและต่อยอด Applications สภาพอากาศที่ทำขึ้นมาเองในอานาคต

3.เพื่อทำความเข้าใจเกี่ยวกับ Applications สภาพอากาศในส่วนลึกได้มากขึ้น

3.ขอบเขต

1.ระบบสามารถบอกอุณหภูมิของสภาพอากาศได้

2.ตัวระบบสามารถบอกฟังก์ชั่นอื่นๆนอกจากอุณหภูมิได้

4. ประโยชน์ที่คาดว่าจะได้รับ

1.สามารถนำไปเป็นกรณีศึกษาสำหรับคนที่อยากจะศึกษาในตัวของ Applications สภาพอากาศนี้ได้

2.ทำให้มีความรู้ในเรื่องของการใช้ภาษา Python มากยิ่งขึ้น

5. ความรู้ที่เกี่ยวข้อง

1.PYTHON

  Python เหมาะสำหรับผู้เริ่มต้นในการ Implement โปรแกรมหรือระบบต่างๆ ด้วยความที่ Python เป็นภาษาระดับสูงทำให้ผู้ใช้งานสามารถอ่านโค้ดได้ง่าย เพราะเป็นภาษาที่ใกล้เคียงกับภาษามนุษย์มาก ทำให้เข้าใจการทำงานของโค้ดได้ง่าย Python เป็นที่สนใจ และเป็นที่นิยมมากขึ้นทุกปี สามารถนนำไปต่อยอดกับองค์ความรู้อื่นๆ ได้ง่าย ยกตัวอย่างที่เห็นได้ชัดคือ Data Science, Machine และ AI นั่นเอง

สำหรับวิธีการติดตั้งจะมีขั้นตอนดังนี้

1. เข้า https://www.python.org/

2. โหลด Python version ล่าสุดเลยครับ เมนู Downloads > Python 3.x.x

3. เมื่อติดตั้ง ให้เลือกเป็นแบบ Customize installation (เพื่อให้เราสามารถเลือก path ที่ต้องติดตั้งได้) และ ให้เลือก Add Python3.8 to PATH ด้วย (อันนี้จำเป็น เพื่อความสะดวก ไม่ต้องเข้าไปตั้งค่า path อีกครั้ง เมื่อเลือกโปรแกรมจะ set path ให้อัตโนมัติ)

Optional Features ให้เลือกแบบ default ไปเลย

ในส่วน Advanced Options เราสามารถเลือก set path ที่จะติดตั้งได้ ให้เลือก Install for all users ก่อน และเราสามารถลือก Customize install location ได้ว่าจะให้ติดตั้งที่ไหน จากนั้นกด Install ได้เลยครับ

ทดสอบการทำงานของ Python ว่าใช้งานได้หรือไม่ โดยการเปิด Command line ขึ้นมา และพิมพ์คำสั่งนี้ครับ จะได้ผลลัพธ์ version ของ Python แสดงขึ้นมา แสดงว่า เราสามารถใช้งาน Python ได้แล้วครับ

2.JSON

JSON เป็นข้อมูลรูปแบบ text ที่มีรูปแบบที่จะเก็บข้อมูลแบบ key, value
ยกตัวอย่างเช่น

{"coord":{"lon":100.5951,"lat":7.1988},"weather":[{"id":801,"main":"Clouds","description":"few clouds","icon":"02d"}],"base":"stations","main":{"temp":303.15,"feels_like":309.19,"temp_min":303.15,"temp_max":303.15,"pressure":1012,"humidity":74},"visibility":10000,"wind":{"speed":1.54,"deg":0},"clouds":{"all":20},"dt":1617677988,"sys":{"type":1,"id":9282,"country":"TH","sunrise":1617664395,"sunset":1617708390},"timezone":25200,"id":1606147,"name":"Songkhla","cod":200}

ซึ่งในตัวอย่างนี้เป็นการเก็บข้อมูลของ API ที่ทำการแปลงข้อมูลให้อยู่ในรูปแบบ JSON หรือรูปแบบข้อความแทน

3. API

API หรือ Application Programing Interface ซึ่งเป็นบริการช่องทางในการเชื่อมต่อเพื่อแลกเปลี่ยนข้อมูลจากระบบหนึ่งไปอีกระบบหนึ่ง ซึ่งใน Project นี้ผู้จัดทำได้ใช้บริการของ OpenWeatherMap เพื่อที่จะใช้งานข้อมูลสภาพอากาศในปัจจุบัน

ซึ่งในการใช้งานจะมีรูปแบบการใช้หลายแบบเช่น

By city name

By city ID

By geographic coordinates

By ZIP code

มีอีกหลายรูปแบบแต่ผู้จัดทำขอยกตัวอย่างเพียงเท่านี้

4.TKINTER

Tkinter เป็นโมดูล อินเตอร์เฟซมาตรฐาน .Tk python Tk GUI Toolkit และ Tkinter สามารถใช้ได้มากที่สุดในแพลตฟอร์ม Unix เดียวกันสามารถนำไปใช้กับทั้งระบบ Windows และ Macintosh, Tk8.0 
Tkinter ให้ความหลากหลายของการควบคุมเช่น ปุ่ม ป้ายและกล่องข้อความ , การใช้งานโปรแกรมประยุกต์แบบ GUI การควบคุมเหล่านี้มักจะเรียกว่าการควบคุมหรือส่วนประกอบ

สำหรับการเขียนโปรแกรม

  1. ตรวจสอบข้อมูลจาก platform open-d ก่อน
    จะเห็นได้ว่า platform open-d ให้บริการข้อมูล 3 รูปแบบคือ
  • CSV(Comma Separated Value): เราสามารถดาวน์โหลดข้อมูลมากเป็นไฟล์ csv และเขียนโปรแกรมให้เข้าไปอ่านไฟล์อีกทีได้
  • RDF(Resource Description Framework): เป็นรูปแบบการส่งข้อมูลที่สนับสนุนการทำ semantic web โดยเราสามารถ ดาวน์โหลดข้อมูลและเขียนโปรแกรมเพื่ออ่านข้อมูลเข้ามาได้เช่นกัน
  • API(Application Program Interface): เป็นช่องทางสำหรับขอใช้บริการคำสั่ง จาก operation system (OS) หรือ application อื่นๆ ผ่าน code ที่กำหนด โดยใน Project นี้จะใช้วิธีนี้ในการดึงข้อมูลกัน

2. เขียนโปรแกรมสร้าง GUI พื้นฐาน

2.1 import library ที่จะใช้ โดยเราจะใช้ 2 ตัวคือ tkinter สำหรับวาด gui และ requests สำหรับการดึงข้อมูลจาก platform open-D

import tkinter as tk
import requests

2.2 วาด GUI จะเห็นว่าจาก requirement โปรแกรมต้องการ 3 ส่วนคือ

  • ช่องสำหรับ input จังหวัดที่ต้องการ
  • ปุ่มสำหรับกดตกลงเพื่อยืนยันการเลือกจังหวัด
  • พื้นที่สำหรับการการแสดงผลการ query ข้อมูล
H = 500 # กำหนดค่าตัวแปรความสูงหน้าต่างโปรแกรม
W = 800 # ตัวแปรความกว้าง

root = tk.Tk()

canvas = tk.Canvas(root, height=H, width=W)
canvas.pack()
root.mainloop()

2.3 เขียน functionตามแบบที่ต้องการ

2.4 นำทุกอย่างมารวมกันก็จะได้โปรแกรมที่มีหน้าต่าง GUI ตอนแสดงผล

6.ผลการดำเนินงาน

แผนผังการทำงานของระบบ


การแสดงผล

จะเป็นหน้าต่างสำหรับให้กรอกชื่อจังหวัดที่ต้องการอยากรู้สภาพอากาศในช่วงเวลานั้น
ในภาพจะเห็นได้ว่าตอนนี้สภาพอากาศของจังหวัดสงขลาเป็นอย่างไรบ้าง

CODE ทั้งหมด

import json
import requests
from tkinter import *
from PIL import ImageTk,Image

root = Tk()
root.geometry("320x320")
root.title("Weather App")
root.configure(bg='white')

# for images

img = ImageTk.PhotoImage(Image.open('1.jpg'))
panel = Label(root,image=img)
panel.place(x=130,y=15)

lable_0 = Label(root,text="Weather App",width = 20,bg='white',font=("bold",20),fg='black')
lable_0.place(x=0,y=93)

city_names = StringVar()
entry_1 = Entry(root,textvariable=city_names)
city_names.set("Enter City Here")
entry_1.place(x=102,y=140)

lable_2 = Label(root,text="Temprature : ",width = 20,bg='white',font=("bold",10),fg='blue')
lable_2.place(x=45,y=220)

lable_3 = Label(root,text="Pressure : ",width = 20,bg='white',font=("bold",10),fg='blue')
lable_3.place(x=45,y=240)

lable_5 = Label(root,text="Humidity : ",width = 20,bg='white',font=("bold",10),fg='blue')
lable_5.place(x=45,y=260)

lable_temp = Label(root,text="...",width = 5,bg='white',font=("bold",10),fg='blue')
lable_temp.place(x=160,y=220)

lable_pres = Label(root,text="...",width = 5,bg='white',font=("bold",10),fg='blue')
lable_pres.place(x=160,y=240)

lable_humi = Label(root,text="...",width = 5,bg='white',font=("bold",10),fg='blue')
lable_humi.place(x=160,y=260)

# unit

lable_humi1 = Label(root,text="%",width = 5,bg='white',font=("bold",10),fg='blue')
lable_humi1.place(x=200,y=260)

lable_Utemp = Label(root,text="C",width = 5,bg='white',font=("bold",10),fg='blue')
lable_Utemp.place(x=200,y=220)

lable_Upres = Label(root,text="Pa",width = 5,bg='white',font=("bold",10),fg='blue')
lable_Upres.place(x=200,y=240)

# api 
def getTemp():

    api_key = "8280aeb47d8dd85caf5984c97d2f6947"
    base_url = "http://api.openweathermap.org/data/2.5/weather?"
    city_name = entry_1.get()
    complete_url = base_url+"appid="+api_key+"&q="+city_name 

    response = requests.get(complete_url)
    x=response.json()

    if["cod"] !='404':
        y = x["main"]
        current_Ktemprature = float(y["temp"])
        current_temprature = current_Ktemprature   - 273.15    #แปลงหน่วย K เป็น C
        current_pressure = y["pressure"]
        current_humidity = y["humidity"]
        
        lable_pres.configure(text=current_pressure)
        lable_temp.configure(text=current_temprature)
        lable_humi.configure(text=current_humidity)
       
    else:
        lable_pres.configure(text="Err")
        lable_temp.configure(text="Err")
        lable_humi.configure(text="Err")
        
Button(root,text="Submit",width=10,bg='black',fg='white',command=getTemp).place(x=122,y=170)

lable_unit = Label(root,text="Temprature in C And Pressure in Pa",width = 40,bg='white',font=("bold",10),fg='black')
lable_unit.place(x=5,y=290)

mainloop()

7.สรุปผลและข้อเสนอแนะ

สรุปการทำงานของ Applications สภาพอากาศนั้นมีความถูกต้องในการแสดงผลถึง 100 %สำหรับหน่วยเคลวิน แต่พอแปลงเป็นหน่วยเซลเซียสแล้วจะมีความถูกต้องอยู่ที่ 50% เนื่องจากเป็นการแปลงหน่วยโดยการใส่ค่าคงที่ที่เป็นทศนิยมในการคำนวณลงไปจึงอาจจะทำให้ผลการแสดงอุณหภูมิของบางจังหวัดไม่ตรงกับความเป็นจริงแต่ฟังก์ชั่นอื่นยังคงมีความถูกต้อง 100%
ข้อเสนอแนะ
Applications สภาพอากาศนี้ยังสามารถที่จะพัฒนาาต่อได้อีกมาก ไม่ว่าจะเป็นเรื่องความถูกต้องในการแสดงผล และรูปแบบการแสดงผล Applications สภาพอากาศนี้เป็น Applications ที่ไม่มีค่าใช้จ่ายในการสร้างเลย แต่สำหรับในอนาคตที่คิดว่าจะพัฒนาต่ออาจจะต้องมีค่าใช้จ่ายเพื่อที่จะเพิ่มฟังก์ชั่นเพิ่มเติมให้มากขึ้นและมีความถูกต้องที่ดีกว่านี้

8.ข้อมูลอ้างอิง

1.api ที่ใช้ในApplications สภาพอากาศนี้

Current weather data – OpenWeatherMap

2.แหล่งข้อมูลที่เกี่ยวข้อง Python

เข้าใจ JSON ใน 5 นาที – borntoDev Digital Academy

Welcome to Python.org

Tkinter (ทีเคอินเตอร์) คืออะไร (mindphp.com)

การสร้าง GUI ด้วย Tkinter | FRA 142 – GUI Lesson (gitbooks.io)

มาทำ python GUI ด้วย tkinter กันดีกว่า (mikkipastel.blogspot.com)

Find current weather of any city using OpenWeathermap API in Python – GeeksforGeeks

Create a desktop Weather App with Python — Hands-on guide to Python GUI programming with Qt (learnpyqt.com)

How to build a Weather app with Python and Django | RapidAPI

3.แหล่งข้อมูลจาก YOUTUBE

Build a Weather App – Python Tkinter GUI Tutorial #24 – YouTube

Weather App using Django – YouTube

Django Project: Build Weather App | From Scratch – YouTube

Weather API using Django – YouTube

ขอบคุณครับ
Share

You may also like...

Leave a Reply