Try   HackMD

<第11回Web会議日程>
2024年09月18日(水)19:00から

第10回 課題

・課題

天気予報Appを実行する「WeatherForecast.py」に
以下の情報を追加してください。
■風の強さ
■波の高さ
■最高気温、最低気温
■6時間毎の降水確率

<修正前>

image

<修正後>

image


・回答例 「WeatherForecast.py

※一部抜粋

# -*- coding:utf-8 -*- import requests import tkinter # GetWeatherForecast関数を定義 def GetWeatherForecast(index): # 天気予報APIのURLを定義 url = "https://weather.tsukumijima.net/api/forecast/city/130010" # 天気予報APIにリスクエスト response_json = requests.get(url) # レスポンスを辞書型に変換 response_dict = response_json.json() # 対象の天気予報情報を取得 weatherinfo = response_dict["forecasts"][index] # date (予報日) date = weatherinfo["date"] # ~省略~ # 風の強さ wind = weatherinfo["detail"]["wind"] # 波の高さ wave = weatherinfo["detail"]["wave"] # temperature(最低・最高気温) min_temp = weatherinfo["temperature"]["min"]["celsius"] max_temp = weatherinfo["temperature"]["max"]["celsius"] # chanceOfRain(降水確率) T00_06 = weatherinfo['chanceOfRain']['T00_06'] T06_12 = weatherinfo['chanceOfRain']['T06_12'] T12_18 = weatherinfo['chanceOfRain']['T12_18'] T18_24 = weatherinfo['chanceOfRain']['T18_24'] # 天気予報の結果として返すメッセージを定義 msg = (""" 【{0}の天気】 日付:{1} 予報:{2} 風の強さ:{3} 波の高さ:{4} 最低気温:{5} 最高気温:{6} 降水確率: 00時~06時:{7} 06時~12時:{8} 12時~18時:{9} 18時~24時:{10} """.format(dateLabel, date, telop, wind, wave, min_temp, max_temp,T00_06,T06_12,T12_18,T18_24)) # label2のtextを更新 label2["text"] =(msg) return # ~省略~

・解説 「WeatherForecast.py

1. 追加情報の取得

天気予報APIからのレスポンスを辞書型に変換した値が変数「response_dict」に格納されている。

・風の強さ

"風の強さ"取得処理を追加して変数に代入

"風の強さ"は
 キー「forecasts」に対応する値の配列の
 キー「detail」に対応する辞書の
 キー「wind」に対応する値 から取得できる

wind = weatherinfo["detail"]["wind"]

・波の高さ

"波の高さ"取得処理を追加して変数に代入

"波の高さ"は
 キー「forecasts」に対応する値の配列の
 キー「detail」に対応する辞書の
 キー「wave」に対応する値 から取得できる

wind = weatherinfo["detail"]["wave"]

・最高気温、最低気温

"最高気温"、"最低気温"取得処理を追加して変数に代入

"最高気温"は
 キー「forecasts」に対応する値の配列の
 キー「temperature」に対応する辞書の
 キー「max」に対応する辞書の
 キー「celsius」に対応する値 から取得できる

max_temp = weatherinfo["temperature"]["max"]["celsius"]

"最低気温"は
 上記のキー「max」をキー「min」に変更すれば取得できる

min_temp = weatherinfo["temperature"]["max"]["celsius"]

・6時間毎の降水確率

6時間毎の降水確率をそれぞれに取得処理を追加して変数に代入

"0 時から 6 時までの降水確率"は
 キー「forecasts」に対応する値の配列の
 キー「chanceOfRain」に対応する辞書の
 キー「T00_06」に対応する値 から取得できる

T00_06 = weatherinfo['chanceOfRain']['T00_06']

6時間毎の降水確率は、
キー「T00_06」をそれぞれ対応するキーに変更すれば取得できる

T06_12 = weatherinfo['chanceOfRain']['T06_12'] T12_18 = weatherinfo['chanceOfRain']['T12_18'] T18_24 = weatherinfo['chanceOfRain']['T18_24']

2.メッセージの修正

GUIに表示するメッセージを変数「msg」に、
上記で取得した情報を追記する


・天気予報API(livedoor 天気互換)について

<天気予報API(livedoor 天気互換)とは>
無料で天気予報を取得できるWebAPIを用意してくれているサイト

https://weather.tsukumijima.net/

以下のURLに地域別に定義されたCITYパラメータを追加してGETリスエストを送ると、JSON形式で天気予報の情報がレスポンスとして返される

https://weather.tsukumijima.net/api/forecast/city/○○

▼CITYパラメータの定義
https://weather.tsukumijima.net/primary_area.xml


・tkinterについて

<tkinterとは>

GUIPython からGUIを構築・操作するためのライブラリ、標準ライブラリの1つ
メインウィンドウにラベルやボタンなどのパーツ(ウィジェット)を配置して構築する

<メインウィンドウ>
GUIのベースとなるウィンドウそのもの
「Tk」クラスをインスタンス化することで生成できる
スクリプトの最後でループさせることで、スクリプトを終了させず、GUI操作の待機をさせることができる

<ラベル(Label)>
Tkinterに備わる文字を表示させるためのウィジェット
「Labal」クラスをインスタンス化して生成できる
オプションを設定することで、フォント・サイズ・太さなどを変更可能

<ボタン(Button)>
Tkinterに備わるボタンを生成するためためのウィジェット
「Button」クラスをインスタンス化して生成できる
オプションでボタンクリック時の動作を指定可能


▼天気予報Appのウィジェット配置イメージ


・requestsについて

<requestsとは>
HTTP通信用のPythonのライブラリ
GET、POST、PUTなどのメソッドが用意されている
今回は、天気予報APIにGETリクエストを送るために使用

外部モジュールのため、利用するにはインストールの必要がある

pip install requests

<GETメソッド>
requests.get(リクエスト送信先URL,リクエストパラメータ)

URLに対してGETリクエストを送ることができる
リスエストの結果が、Responseオブジェクトとして返される