Try   HackMD
tags: Python勉強会

Python勉強会 第8回 課題

<第8回Web会議日程>
2022年08月24日(水) 19:00から

課題

天気予報Appを実行する「WeatherForecast.py」がある。

このAppで表示する情報に以下を追加してください。

・風の強さ

・波の高さ

・最高気温、最低気温

・6時間毎の降水確率


・スクリプト概要

「天気予報API」 に対し、「requests」 ライブラリを利用し、GETリクエストを送り、レスポンスデータを取得する。
取得結果は 「tkinter」 ライブラリを使用し、GUIで表示させる。


・天気予報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

・requestsについて

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

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

pip install requests

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

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

・JSONについて

<JSONとは>
「JavaScript Object Notation」の略で、「JavaScriptのオブジェクトの書き方を元にしたデータ定義方法」のこと

<JSONの形式>
・{} の中にキーと値をコロンで区切って記述
・カンマで区切ると、キーと値の組み合わせを複数記述可能
・[]を使うことで配列の表現も可能

⇒Pythonでは、辞書型として取り込むことが可能

・tkinterについて

<tkinterとは>

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

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

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

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


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

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →


・スクリプト仕様

1   GetWeatherForecast関数を定義
1-1   変数「url」に天気予報APIのURLを代入
1-2   1-1で代入したURLに対し、GETリクエストを送信した結果のJSONデータを変数「response_json」に代入
1-3   変数「response_json」のJSONデータを辞書型に変換して変数「response_dict」代入
1-4   変数「weatherinfo」に変数「response_dict」のKeyが"forecasts"の値のうち、Keyが変数「index」の値を代入
1-5   変数「date」に変数「response」のKeyが"date"の値を代入
1-6   変数「dateLabel」に変数「response」のKeyが"dateLabel"の値を代入
1-7   変数「telop」に変数「response」のKeyが"telop"の値を代入
1-8   label2のtextパラメータに、取得した天気予報情報を代入


2   GUIのパーツを生成・定義
2-1   変数「root」にメインウィンドウに対応するTkインスタンスを生成して代入
2-2   メインウィンドウ「root」のタイトルを設定
2-3   メインウィンドウ「root」のサイズを設定
2-4   変数「label1」にLabelインスタンスを生成して代入
2-5   「label1」を配置
2-6   変数「label2」にLabelインスタンスを生成して代入
2-7   「label2」を配置
2-8   変数「button1」にButtonインスタンスを生成して代入
2-9   「button1」を配置
2-A   変数「button2」にButtonインスタンスを生成して代入
2-B   「button2」を配置
2-C   変数「button3」にButtonインスタンスを生成して代入
2-D   「button3」を配置
2-E   メインウィンドウ「root」をループで起動



・GetWeatherForecast関数 補足

<GetWeatherForecast関数>
GetWeatherForecast関数では、レスポンスのJSONデータ中の多数の情報の中から、
キーが「forecasts」の値を天気予報情報として取得している

<キー「forecasts」の値について>
キーが「forecasts」の値は以下のように、3つの辞書の配列として格納されている

▼キー「forecasts」 ※一部抜粋

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

<データ取得方法>
明日のキーが「telop」の値を取得する場合、以下のように記述する

# キーが「forecasts」の値の配列のうち、2つ目の辞書を指定
weatherinfo = response_dict["forecasts"][1]

# キーが「telop」の値を指定
telop = weatherinfo["telop"]

※天気予報APIのレスポンスは
サイトの「JSON データサンプル」で参照可能