PythonでGUIを作る④ GUIを起動するGUI編

1.はじめに

今回はGUIを起動するGUI編と題しまして、今まで作成したGUIを1つのGUIから起動できるようにしたいと思います。

2.GUIを起動するGUI

コードは以下のようになります。

import PySimpleGUI as sg
import os
import importlib

def main():
    script_dir = os.path.dirname(os.path.abspath(__file__)) if '__file__' in globals() else os.getcwd()

#GUIを追加する場合は↓にボタンを追加
    layout = [
        [sg.Button('起動したいGUI名')],
        [sg.Button('終了')]
    ]

    window = sg.Window('メイン', layout)

    while True:
        event, values = window.read()
        
        if event == sg.WIN_CLOSED or event == "終了":
            break

#GUIを追加する場合は↓のコードを複製
        elif event == '起動したいGUI名':
            import lib.起動したいGUI名 as add_module #「lib.起動したいGUI名」はフォルダ名
            add_window = add_module.sub_window()

    window.close()

if __name__ == "__main__":
    main()

このようになります。意外とシンプルですね。ただところどころコツがあるので順々に説明していきます。

2-1.フォルダ構成

別のGUIを持ってくる関係上、pathを参照するのでフォルダ構成は重要になります。今回使用するフォルダ構成は以下のようになります。

他にもフォルダがありますが、勝手にできたりするものなので無視してもらって大丈夫です。

フォルダの場所はMainGUIの

import lib.起動したいGUI名 as add_module #「lib.起動したいGUI名」はフォルダ名

に対応しています。適宜変更してください。

2-2.起動したいGUIの編集

GUIから他のGUIを起動する都合上、呼びだしたいGUIも若干編集する必要があります。例を以下に記します。

"""
import省略
"""

def sub_window():
"""
コード本文省略
"""

if __name__ == "__main__":
    sub_window()

このような感じでコード本文をdef関数で囲む必要があります。これはMainGUIの

add_window = add_module.sub_window()

に対応しています。関数名はsub_windowでなくても大丈夫ですが、MainGUIと呼びだしたいGUIで統一する必要があります。

2-3.その他

作成中にいくつかつまずいた点がありましたので、原因と解決方法を記載します。参考になれば幸いです。

  • MainGUIに戻れない

呼び出したGUIからMainGUIに戻れない現象が多々発生します。主に原因は2つなのですが、1つは次の項目で詳しく説明します。

考えられる原因として、呼び出したGUIでエラーが起きていると思われます。特にウィンドウを閉じるときのエラーは呼びだしたいGUIのみを使う場合はほぼ関係ないのでスルーしがちです。エラーが起きる原因としては、中途半端に記入、空白、複数のウィンドウ等の原因があると思います。
解決方法として、記入された数値などをリセットしてから閉じると解決できると思います。コードは

"""
コード本文
"""
    graph.close()
    graph = None
            
window.close()

となります。エラーが起きている場所にNoneを入れてからwindow.close()しましょう。コードによっては、事前にgraph = Noneを定義する必要があるので、エラーメッセージが出る場合は試してみてください。挿入する場所は、GUIを起動する直前になります。

  • 1回目は起動したのに2回目以降起動しない

非常に厄介なエラーです。エラーメッセージが出る場合と出ない場合がありますが、エラーメッセージが出ても間違ったエラー原因を示してきます。GUIが正常に閉じれていないことが原因で起きるエラーです。

まず、エラーが起きているかの確認方法ですが、タスクマネージャーで確認できます。見た目上は閉じているのですが、見えないところで起動し続けています。タスクマネージャーからタスクの終了をしてもいいですが、PCの再起動をお勧めします。

解決方法ですが、GUI終了時にclose関連のエラーメッセージをなくすことと隠れているウィンドウがないか確認してください。おそらくですが隠れているウィンドウはwindow.close()等で閉じることができません。window.hide()のようにウィンドウを隠すコードを使っている場合は要注意です。

3.おわりに

今回はGUIを起動するGUIを作成してみました。コード事態は難しくないですが、細かいところに気を付けないといけないので、思った以上に時間がかかりました。特に2個目のエラーで苦しめられました。

GUIをまとめることで、GUIの機能拡張や軽量化ができるので、飛躍的にできることが多くなると思います。何かしらの参考になれば幸いです。

コメント