タイトル画像
琴葉茜

ここから、ポケモン図鑑の機能を作っていくことになるんだけど、「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」を押すと良いよ!

解説画像1
琴葉葵

おおー!検索がうまくいった場合は緑色のデザインになって、失敗した場合は赤色のデザインになるんだね!

琴葉茜

「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のポケモンは見つかりませんでした。")