bororo
@bororo

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

PySimpleGUIのフォームが表示されません。

解決したいこと

PythonとGUIを連携して天気予報アプリを作っています。
使用しているGUIは、PySimpleGUIです。
コードを書き終え、フォームを開こうとする所でエラーが発生しました。
解決方法を教えて下さい。:cry:

発生している問題・エラー

Fatal Python error: _PyEval_EvalFrameDefault: Executing a cache.
Python runtime state: initialized

スクリーンショット 2024-10-14 200924.png

該当するソースコード

#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のアップデート・再インストールを行いました。

0

1Answer

,(カンマ)が足りないように見えますが、関係ありませんか?

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.Button('OK', key = 'read'), sg.Button('キャンセル', key = 'cancel')],
            [sg.Output(size = (80,20))] ]
1Like

Comments

  1. @bororo

    Questioner

    回答ありがとうございます!指摘していただいた部分修正しましたが、エラー内容は変わりませんでした💦他に原因ありそうでしたら、よろしくお願いします。

  2. @bororo

    Questioner

    もしかしたら、PySimpleGUIに登録してないのが原因でしょうか。登録を行っていないのですが...誰かお答えいただけると幸いです。

  3. もしかしたら、PySimpleGUIに登録してないのが原因でしょうか。

    可能性はあります。

    自分は互換ライブラリ↓を使いました。

    インストール
    python -m pip install tkeasygui
    
    import書き換え
    #import PySimpleGUI as sg
    import TkEasyGUI as sg
    
  4. もしかしたら、PySimpleGUIに登録してないのが原因でしょうか。

    a.png

    2行目(import文)でエラーが起きているようなので、まさしく「それ」でしょう。

  5. @bororo

    Questioner

    回答ありがとうございます。以前のエラーは消えまして、現在

    [sg.Button('OK', key = 'read'), sg.Button('キャンセル', key = 'cancel')]
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    [sg.Output(size = (80,20))] ]
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^
    

    TypeError: list indices must be integers or slices, not Output

    このようなエラーが出ております。アドバイスご教授お願い致します。

  6. ,(カンマ)が足りないように見えますが、関係ありませんか?

    ↑これでは?

  7. @bororo

    Questioner

    すいません💦見逃しておりました...アドバイスありがとうございます。

  8. @bororo

    Questioner

    @nka435さん!
    ありがとうございます。:relaxed:

  9. 上手く動作したということであれば、当Q&Aをクローズしてください。

Your answer might help someone💌