PySimpleGUIで画面作成

みなさん、こんにちは。入社1年目のsiです。

私はイノベーションLABという部署に配属され、Pythonの研修を受けました。その後、画面を備えた簡易的なツールの開発が必要となったため、学んだPythonを使って作成しようとPySimpleGUIに挑戦しました。本記事では、その際に調べた基本的な画面の作成方法について書いていきます。


1. PySimpleGUIとは

PythonのGUIの1つです。以下のコマンドでインストールして使用しました。

$ python -m pip install PySimpleGUI


readmeよりPySimpleGUIについて以下のように書かれています。

PySimpleGUIはあらゆるレベルのPythonプログラマがGUIを作成できるようにするPythonパッケージです。ウィジェットを含む「レイアウト」を使用して、GUIウィンドウを指定します(PySimpleGUIでは「エレメント」と呼びます)。

使用するプログラムやフレームワークにもよりますがPySimpleGUIでのプログラムはフレームワークのいずれかを直接使用して同じウィンドウを作成するよりも、コードの量は1/2から1/10程度になる場合があります。

日本語に翻訳されたreadmeファイルもあり、他のGUIであるtkinterやQtよりも初期のハードルが低いと考えられています。


2. 前提条件

  • VSCode - 1.83.1
  • Ubuntu - 22.04.3 LTS
  • Python - 3.11.3
  • pip - 23.2.1
  • PySimpleGUI - 4.60.5

3. 画面作成

3-1. 基本の流れ

レイアウトを作成する
ウィンドウを作成する
イベントループを作成する
ウィンドウを閉じる

import PySimpleGUI as sg

# レイアウトの作成
layout = [[ ]]

# ウィンドウの作成
window = sg.Window('Title', layout, size=(500, 200))

# イベントループの作成
while True:
    event, values = window.read()
    if event == sg.WIN_CLOSED:
        break

# ウィンドウを閉じる
window.close()
上記のコードで作成される画面


以下で順番に説明していきます。

3-2. レイアウトの作成

layout = [
            [sg.Text("1. "), sg.Input(key=1)],
            [sg.Text("2. "), sg.Input(key=2)],
            [sg.Text("3. "), sg.Input(key=3)],
            [sg.Text("4. "), sg.Input(key=4)],
            [sg.Text("5. "), sg.Input(key=5)],
            [sg.Button('ok')]
         ]



2次元配列で配置を指定していきます。
内側の配列1つで1行分のレイアウトを表し、カンマ(,)で区切ることで要素を横に配置していきます。要素を縦に並べる場合は、もう1つ配列をつくります。


要素をいくつか紹介します。HTMLで使用するような、一般的な要素は揃っていると思います。

  • sg.Text:テキストの表示
  • sg.Input:一行のテキスト入力欄
  • sg.Multiline:複数行のテキスト入出力
  • sg.Listbox:指定された値が一覧表示され、その中から選択
  • sg.Radio:同じgroup_idで指定された複数の選択肢から1つを選択
  • sg.Checkbox:はい/いいえの二者択一
  • sg.Spin:矢印を使用して選択するリストボックス
  • sg.Button:何らかのイベントを実行

3-3. ウインドウの作成

window = sg.Window('Title', layout, size=(100, 500))

タイトルバーに表示させる文字列とレイアウトを引数に指定します。
また、“size=(横, 縦)”で開くウィンドウサイズを指定することができます。

3-4. イベントループの作成

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

“while True”のループの中で条件式を提示します。
イベントはボタン要素や“enable_event=True”と指定した要素を押したときに実行されます。


ボタン要素の場合、①ボタンのテキスト、②sg.OK( )やsg.Cancel( )といったショートカット、③keyで指定した文字列のいずれかでイベントが実行します。

layout = [[sg.Button('ok'), sg.OK(), sg.Button('-ok-', key='-ok-')]]
while True:
    event, values = window.read()
    if event == sg.WIN_CLOSED:
        break
    if event in ('ok', 'OK', '-ok-'):
        print(event)



“enable_event=True”の場合は、keyで指定した文字列によってイベントを実行させます。


if文の処理を“break”とすると、イベントループの外に出て、ウィンドウが閉じられます。
“sg.WIN_CLOSED”はタイトルバーにある“×”が押された時を表します。代わりに“None”を記述しても同じ動作になります。

3-5. ウィンドウを閉じる

window.close()

終了処理です。ファイル処理と同様、開いて読みこんだウィンドウを"close( )"して終わります。

4. 最後に

レイアウトに2次元配列を使用することで、ソースコード内でも視覚的に配置できるため、感覚的に画面を作成できると思います。FrameやColumnといった要素を使って、複数の要素をグループ化して組み込むことも可能です。
PySimpleGUIのページには、YouTubeの再生リストもあるので、試す際には参照してみてください。
最後までご覧いただきありがとうございます。


5. 参考

www.pysimplegui.org
github.com
PySimpleGUI 2020-2022 Edited (to save you time) Versions - YouTube