見出し画像

PySimpleGUIでグラフを閉じた時に起きるバグ

自作家計簿アプリをPythonで作った際に起こったバグについて共有します。
まずはどのようなバグなのかを見てもらいましょう。

バグの紹介

少し小さくなってしまったので見づらいですが、matplotlibで作成したグラフを閉じた瞬間にアプリが急に終了しています。
次になぜこのようなバグが起きたのか考えます。


結論:matplotlibで作成したグラフのウィンドウをPySimpleGUIのウィンドウに埋め込まなかったことが原因

上記のように結論づけます。
理由は以下の通りです。

1.matplotlibで作成したグラフのウィンドウがプログラムの本文に記載されていない

私のアプリの構造は以下のようになっています。

アプリの構造

バグが起きるのは、赤色で表示された「支出の内訳グラフ」の画面を閉じた時に起きます。そしてこの画面はPySimpleGUIのWindowとして定義されていません。これによりバグが起こっているかもしれません。

エラーの種類がSegmentation Faultである

zsh: segmentation fault

エラーでできたのはこれ。
今まで見たことがないものなので調べました。
ChatGPTによると、

"自分のものではない" メモリにアクセスすることによって発生する、特定の種類のエラーのことである。セグメンテーション・フォールトは、メモリが破損したり、デバッグしにくいメモリ・バグが発生したりするのを防ぐためのメカニズムです。セグメンテーションフォールトが発生するときはいつも、すでに解放されている変数にアクセスしたり、メモリの読み取り専用部分に書き込んだりするなど、メモリに対して何か間違ったことをしていることがわかります。オペレーティングシステムは、プロセスを終了させます。

問題の原因はわかりませんでしたが、どうやらPythonのスクリプト上での問題ではないようです。
一応ここにグラフを生成する関数と、イベントのループ部分を載せておきます。

問題の部分
1.グラフの作成


2.ループの中での部分



プログラムのメインとなる部分


環境による問題か?

Python, PySimpleGUI, matplotlibの3つ全てが最新のバージョンなので、これは問題ではないでしょう(2024年5月)。

私は基本windowsを利用していますが、今回のアプリ作成はmacを使用していました。よってwindowsでも試してみました。

結果:windowsでは問題なくグラフを閉じることができた


つまりmacのosによるバグではないかと言えます。

考察

segmentation faultのエラーは、直接Pythonが引き起こしたものではなく、c言語を使っているmatplotlibにあるかもしれません。
また作成したぐらふをPySimpleGUIのウィンドウに埋め込むのではなく、直接matplotlibの機能でグラフを表示していることに危険性があります。
しかしwindowsでは問題なく動いたのを見ると、osによる問題もあるのではないでしょうか。


macでプログラムを作成するときは、上記のバグが発生しないように気を付けます。


この記事が気に入ったらサポートをしてみませんか?