ここから、ポケモン図鑑の機能を作っていくことになるんだけど、「PokeAPI」を利用して情報を得るには「全国図鑑のID」か「ポケモンの英語名」しか使えないんだよね
え、それじゃあポケモンの名前で検索はできないじゃん!!どうするの!?
そこで今回は、事前に「ID」と「ポケモンの日本名」をまとめたJSONファイル「poke_dict.json」を用意しといたから、これをダウンロードして使おうか
ちなみに中身はこんな感じだよ
{
"フシギダネ": 1,
"フシギソウ": 2,
"フシギバナ": 3,
"ヒトカゲ": 4,
"リザード": 5,
"リザードン": 6,
"ゼニガメ": 7,
"カメール": 8,
"カメックス": 9,
...
}
おねーちゃんナイス!!
PokeAPIを頑張って辿ればポケモンの日本名は出てくるから自分でJSONファイルを作っても良いんだけど、ポケモンは1000種類以上いるから短期間に沢山APIを利用しようとすると負荷をかけて迷惑になるしね
じゃあひとまずこの項目ではJSONファイルを元にした機能を作る感じだね
そういうこと
今回は前回の表示機能を「ポケモンの日本名かIDを入力することで両方の情報が表示される機能」に変えていくよ
そしたら、まずはJSONファイルの読み込みからだね!確か、ライブラリの「json」を使うんだったよね?
お、よく覚えていたね!前回やってるから、改めて説明しなくても大丈夫そうかな
じゃあ早速、JSONを読み込むプログラムを「st.title("ポケモン図鑑")」よりも上の行に作ろうか!
import json
# JSONファイルを読み込み(日本語名 → ID)
with open("poke_dict.json", "r", encoding="utf-8") as f:
NAME_TO_ID = json.load(f)
# ID → 日本語名 の逆引き辞書も作成
ID_TO_NAME = {str(v): k for k, v in NAME_TO_ID.items()}
「NAME_TO_ID」は「ポケモンの名前」からIDを調べるための辞書型の変数で、「ID_TO_NAME」はその逆ってことだね
そういうことだね!じゃあ次はボタンを押した時の処理になる「if search_btn:」の部分を作っていこう
入力された内容が「NAME_TO_ID」のキーに一致するものがあればIDを調べて、「ID_TO_NAME」のキーで一致するのがあれば名前を調べたら良いって感じかな?
そういうことだね!それと、どちらにも一致しなかった場合の処理も追加しておくと、こんな感じになるかな
# 検索処理
if search_btn:
if user_input in NAME_TO_ID:
# 名前で一致した場合
poke_id = NAME_TO_ID[user_input]
st.success(f"{user_input} のIDは {poke_id} です!")
elif user_input in ID_TO_NAME:
# IDで一致した場合
poke_name = ID_TO_NAME[user_input]
st.success(f"{poke_name} のIDは {user_input} です!")
else:
st.error("指定したポケモンは見つかりませんでした。")
結構そのまんまだね!...ん??よく見たら、ここで文字を表示する時は「st.write()」じゃないんだね
お、よく気づいたね!!実は文字のStreamlitの表示方法は色んな種類があって、用途に合わせたデザインに自動で整えてくれるんだよ
ほうほう
ということで早速、どんなふうにデザインが違っているか更新して確認しよう!
ちなみに、もしすでにStreamlitを動かしている時にプログラムを更新した場合は、ブラウザで開いてるページの右上の「Rerun」を押すと良いよ!
おおー!検索がうまくいった場合は緑色のデザインになって、失敗した場合は赤色のデザインになるんだね!
「st.write()」の代わりに「st.success()」にするだけでデザインが変わるのは便利でしょー
この調子でどんどん機能を追加していくよ!
この時点での全体のプログラム
import streamlit as st
import json
# タイトル・説明
st.title("ポケモン図鑑")
st.write("これから段階的に機能を増やしていこう!")
# JSONファイルを読み込み(日本語名 → ID)
with open("poke_dict.json", "r", encoding="utf-8") as f:
NAME_TO_ID = json.load(f)
# ID → 日本語名 の逆引き辞書も作成
ID_TO_NAME = {str(v): k for k, v in NAME_TO_ID.items()}
# 入力とボタン
user_input = st.text_input("ポケモンの名前またはIDを入力してください")
search_btn = st.button("検索")
# 検索処理
if search_btn:
if user_input in NAME_TO_ID:
# 名前で一致した場合
poke_id = NAME_TO_ID[user_input]
st.success(f"{user_input} のIDは {poke_id} です!")
elif user_input in ID_TO_NAME:
# IDで一致した場合
poke_name = ID_TO_NAME[user_input]
st.success(f"{poke_name} のIDは {user_input} です!")
else:
st.error("その名前やIDのポケモンは見つかりませんでした。")
