みなさん、こんにちは。入社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.orggithub.com
PySimpleGUI 2020-2022 Edited (to save you time) Versions - YouTube