🐍
Lesson18 コード解説
仕様
・緯度経度を入力して最寄り駅を表示させるアプリケーションの作成
・最寄り駅を検索するのはAPIを活用する
・画面イメージ
実行前
実行後
ソースコード
import json
import tkinter as tk
import webbrowser
import requests
# ブラウザの起動
def webbrowser_open():
url = 'https://www.google.co.jp/maps/'
webbrowser.open_new(url)
webbrowser.open(url, 1)
# 最寄駅検索
def station(keido, ido):
print("station START")
api = 'http://express.heartrails.com/api/json?method=getStations&x={x},&y={y}'
url = api.format(x=keido, y=ido)
ret = requests.get(url) # Webサーバーにリクエストを送る
ret_json = json.loads(ret.text) # JSON文字列を辞書型に変換
Line = ret_json["response"]["station"][0]["line"]
station = ret_json["response"]["station"][0]["name"]
distance = ret_json["response"]["station"][0]["distance"]
msg_info(Line, station, distance)
# pprint.pprint(ret_json) #整形して出力
def msg_info(Line, station, distance): # infoの場合
print("msg_info START")
station_info_line_name_dis["text"] = Line + "の" + station + "駅です。" + "距離は" + distance + "です。"
root = tk.Tk()
root.title("最寄駅検索")
root.geometry("500x300")
gm = tk.Label(text="Google Mapを起動します")
bt_gm = tk.Button(text="Google Map", command=webbrowser_open)
idokeido = tk.Label(text="緯度と経度を入力してください")
ido = tk.Entry(text="緯度")
keido = tk.Entry(text="軽度")
bt_sc = tk.Button(text="検索", command=lambda: station(keido.get(), ido.get()))
station_info = tk.Label(text="最寄りの駅は・・・")
station_info_line_name_dis = tk.Label(text="◯◯◯線。◯◯◯駅。距離は◯◯◯m")
# 配置
gm.pack()
bt_gm.pack()
idokeido.pack()
ido.pack()
keido.pack()
bt_sc.pack()
station_info.pack()
station_info_line_name_dis.pack()
root.mainloop()
ソースコード解説
プログラムを部分的に切り取って解説します。
特に新しい要素はないですが、tkinterで使用する各パーツの使い方、JSON形式データの処理方法などはしっかり復習しておいてください。
インポート部分
import json #JSONデータの操作
import tkinter as tk #画面設計
import webbrowser #ブラウザを表示させるためのもの
import requests #サーバーに通信する(APIをつかうとき)
「GoogleMapボタン」を押したときの処理
def webbrowser_open():
# ブラウザで開くURLを指定
url = 'https://www.google.co.jp/maps/'
# ブラウザを新規で開く
webbrowser.open(url, 1)
webbrowser.open(url, 1)
・第一引数:開きたいURL
・第二引数:表示モードを設定
0:同じウィンドウで開く
1:新規ウィンドウで開く
2:新しいタブで開く
最寄り駅を検索する関数(APIを使う部分)
def station(keido, ido):
# URLを設定
api = 'http://express.heartrails.com/api/json?method=getStations&x={x},&y={y}'
url = api.format(x=keido, y=ido)
# サーバーにリクエストを送る(API通信開始)。サーバーからの返答を変数retに代入
ret = requests.get(url)
# サーバーから返ってきたデータ(JSONデータ)を辞書型に変換
ret_json = json.loads(ret.text)
# 辞書型のデータからキーを指定してバリューを取り出す
Line = ret_json["response"]["station"][0]["line"]
station = ret_json["response"]["station"][0]["name"]
distance = ret_json["response"]["station"][0]["distance"]
# 取得した情報を表示する形式に整える
msg_info(Line, station, distance)
・station関数の引数には緯度と経度をいれるようにする
・以下の
# URLを設定
api = 'http://express.heartrails.com/api/json?method=getStations&x={x},&y={y}'
url = api.format(x=keido, y=ido)
をもう少しスマートに書いてもOK
# URLを設定
url = f"http://express.heartrails.com/api/json?method=getStations&x={ido},&y={keido}"
取得した情報を表示する形式に整える処理
def msg_info(Line, station, distance): # infoの場合
station_info_line_name_dis["text"] = Line + "の" + station + "駅です。" + "距離は" + distance + "です。"
・msg_info関数の引数
第一引数:路線名
第二引数:駅名
第三引数:距離
画面設計とメイン処理
root = tk.Tk()
# ウィンドウのタイトル設定
root.title("最寄駅検索")
# ウィンドウサイズの設定
root.geometry("500x300")
# ラベル
gm = tk.Label(text="Google Mapを起動します")
# グーグルマップを開くボタン
bt_gm = tk.Button(
text="Google Map",
command=webbrowser_open #クリックしたときの処理
)
# ラベル
idokeido = tk.Label(text="緯度と経度を入力してください")
# 緯度経度の数値を入力ボックス
ido = tk.Entry(text="緯度")
keido = tk.Entry(text="軽度")
# 入力した緯度経度を使ってstation関数を実行
bt_sc = tk.Button(text="検索", command=lambda: station(keido.get(), ido.get()))
# 取得した情報を表示させる部分
station_info = tk.Label(text="最寄りの駅は・・・")
station_info_line_name_dis = tk.Label(text="◯◯◯線。◯◯◯駅。距離は◯◯◯m")
# パーツの配置
gm.pack()
bt_gm.pack()
idokeido.pack()
ido.pack()
keido.pack()
bt_sc.pack()
station_info.pack()
station_info_line_name_dis.pack()
root.mainloop()
使ったAPI
Discussion