🐍

Lesson18 コード解説

2024/12/07に公開

仕様

・緯度経度を入力して最寄り駅を表示させるアプリケーションの作成
・最寄り駅を検索するのは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

http://express.heartrails.com/api.html

Discussion