PySimpleGUIのフォームが表示されません。
Q&A
Closed
解決したいこと
PythonとGUIを連携して天気予報アプリを作っています。
使用しているGUIは、PySimpleGUIです。
コードを書き終え、フォームを開こうとする所でエラーが発生しました。
解決方法を教えて下さい。
発生している問題・エラー
Fatal Python error: _PyEval_EvalFrameDefault: Executing a cache.
Python runtime state: initialized
該当するソースコード
#PySimpleGUIをインポート
import PySimpleGUI as sg
import get_weather as gw
#テーマ設定
sg.theme('DarkAmber')
#コンポーネント設定
layout = [ [sg.Text('天気予報')],
[sg.Text('場所コードと、予報日を教えてください。')],
[sg.InputText('', key = 'city'),sg.Combo(([0, 1, 2]), default_value = "0", key = 'day')],
[sg.Button('OK', key = 'read'), sg.Button('キャンセル', key = 'cancel')]
[sg.Output(size = (80,20))] ]
#ウィンドウの生成
window = sg.Window('天気予報', layout)
#イベントループ
while True:
event, values = window.read()
if event == sg.WIN_CLOSED:
break
if event == 'read':
result = gw.get_weather_info(values['city'], values['day'])
#Output
print(result)
window.close()
#HTTPリクエストを行うための「requests」ライブラリをインポート
import requests
import datetime
#天気情報取得メソッド
def get_weather_info(city_no, day):
if type(city_no) != int or type(day) != int:
return
try:
#リクエストurlを作成
url = f"https://weather.tsukumijima.net/api/forecast?city={city_no}"
#レスポンスを辞書形式に変換して取得
response_data = requests.get(url).json()
#天候の情報を取得 ※forecastsをキーに指定
weather_data = response_data["forecasts"][day]
#各情報を取得
date = weather_data['date'] #日付
title = response_data['title'] #タイトル
weather = weather_data['telop'] #天候情報
max_temp = weather_data['temperature']["max"]["celsius"] #最高気温
min_temp = weather_data['temperature']["min"]["celsius"] #最低気温
#現在時刻取得
now = datetime.datetime.now().time().strftime("%H:%M")
# 明日の降水確率(平均値)
chanceOfRainOfKey = weather_data['chanceOfRain']
#今日日付の場合
if day == 0:
#過ぎた時間以外の降水確率を取得する
if now <= "06:00" :
chanceOfRainList = {
"T00_06": int(chanceOfRainOfKey['T00_06'].replace('%', ''))
}
if now <= "12:00":
chanceOfRainList = {
"T06_12": int(chanceOfRainOfKey['T06_12'].replace('%', ''))
}
if now <= "18:00":
chanceOfRainList = {
"T12_18": int(chanceOfRainOfKey['T12_18'].replace('%', ''))
}
if now <= "24:00":
chanceOfRainList = {
"T18_24": int(chanceOfRainOfKey['T18_24'].replace('%', ''))
}
#今日以外の未来日付の場合
else:
chanceOfRainList = {
"T00_06": int(chanceOfRainOfKey['T00_06'].replace('%', '')),
"T06_12": int(chanceOfRainOfKey['T06_12'].replace('%', '')),
"T12_18": int(chanceOfRainOfKey['T12_18'].replace('%', '')),
"T18_24": int(chanceOfRainOfKey['T18_24'].replace('%', ''))
}
#降水確率の平均を計算
avgChanceOfRain = sum(chanceOfRainList.values()) / len(chanceOfRainList)
minTempMsg = ("最低気温を取得することが出来ませんでした" if min_temp is None else f"最低気温は{min_temp}です")
results = f"{date}の{title}は、{weather}です。\n最高気温は{max_temp}度\n{minTempMsg}。\n降水確率は{avgChanceOfRain}%です。"
return results
except requests.exceptions.RequestException as e:
return f"天気情報の取得に失敗しました: {e}"
#メソッド呼び出し
result = get_weather_info(120010, 1)
print(result)
自分で試したこと
PySimpleGUIのアップデート・再インストールを行いました。