PySimpleGUI入門
1.概要
PySimpleGUIは、PythonでGUI(注1)を容易に作成するために開発されたパッケージ(ライブラリ)です。 PySimpleGUIでは、「 レイアウト 」を使用してこのボタンやアイコンを並べ、GUIウィンドウを指定します。なお、このボタンやアイコンおよび入力窓などの部品は、PySimpleGUIでは「 エレメント 」と呼びます。(他のGUIライブラリ(tkinterなど)では、ウィジェットと呼んでいるものもあります)
(注1)GUIとはグラフィカルユーザインターフェース(Graphical User Interface)の略で、画面上にボタンやアイコンを表示し、直感的に操作できるようにしたものです。 (参考)PySimpleGUIは、書籍「Python2年生 デスクトップアプリ開発のしくみ」(森 巧尚, 翔泳社, 2022.12.19)などでも採用されています。
2.公式ページ
本ページではサンプルプログラムで典型的な使用例を示しているだけなので、詳細は公式ページをご覧ください。
英語:https://www.pysimplegui.org/en/latest/
日本語:https://www.pysimplegui.org/en/latest/readme Japanese/
リファレンス:https://www.pysimplegui.org/en/latest/call reference/
デモプログラム:https://github.com/PySimpleGUI/PySimpleGUI/tree/master/DemoPrograms
3.準備
PySimpleGUIライブラリは外部ライブラリなのでインストールが必要です。
詳細なインストール手順については、外部ライブラリのインストール方法を参照してください。
エディタにThonnyを使っている場合
Thonnyのメニューの「ツール」の「Manege Packages…」を選択。表示されたウィンドウでの入力欄に「pygame」と入れて「Search on PyPI」(または「PyPIでパッケージを検索」)ボタンをクリック。そこで出てきたSearch resultsの中から「PySimpleGUI」をクリック。PySimpleGUIについての表示になったら、「インストール」をクリックすればOK。
エディタにThonnyを使っていない場合
コマンドプロンプトを起動し、「python -m pip install PySimpleGUI」と打ちます。
python -m pip install PySimpleGUI
4.サンプルプログラム
プログラム
# パート 1 - インポートimport PySimpleGUI as sg
# パート 2 - レイアウトmy_layout = [[sg.Text("お名前は何ですか?")], [sg.Input(key='-入力-')], [sg.Text(size=(55,1), key='-出力-')], [sg.Button('決定'), sg.Button('終了')]]
# パート 3- ウィンドウ定義my_window = sg.Window('ウィンドウタイトル',my_layout)
# パート 4- イベントループwhile True: event, values = my_window.read() # ユーザーが終了したか、ウィンドウが閉じられた場合は終了 if event == sg.WINDOW_CLOSED or event == '終了': break # ウィンドウにメッセージを表示 my_window['-出力-'].update('ハロー ' + values['-入力-'] + "さん!")
# パート 5 - ウィンドウクローズmy_window.close()
(出典:PySimpleGUI “Readme Japanese” ※解説用に一部編集)
出力例
解説
詳細な解説は公式ページを参照してください
- パート 1 - インポート
このプログラムでライブラリPySimpleGUIを使えるようにインポートします。インポートするときは「sg」という名前を付けることが推奨されています。
- パート 2 - レイアウト
ウィンドウの内容を定義します。エレメントの配置はリストで定義します。Inputエレメント、Textエレメント、Buttonエレメントなどには、keyを設定することができます。keyを設定しておけば、他の所でこのエレメントを簡単に利用できます。keyの名前は、key=’-KEY-‘のようにハイフン(-)で挟むようにすることが推奨されています。
- パート 3- ウィンドウ定義
ウィンドウを作成します。最初の引数にはウインドウのタイトルとして表示する文字列を渡します。2つ目には先程設定したレイアウトを渡します。
- パート 4- イベントループ
ウィンドウを表示し、イベント(入力)を待ちます。
ユーザーが[終了]ボタンをクリックしたか、ウィンドウが閉じられた場合(右上の×ボタンクリック)はループを抜けます。
[OK]ボタンをクリックした場合は、ウィンドウにメッセージを表示します。メッセージを表示するために、キーが’-出力-‘であるエレメントをupdateメソッドで更新しています。
- パート 5 - ウィンドウクローズ
ウィンドウを閉じて終了します。
やってみよう
- ラジオボタンで「四角形」「円」「三角形」のどれかを選んで、画面にその図形を表示するようにしよう
サンプルコード:
参考:Demo_Graph_Drawing_And_Dragging_Figures.py
(以下、あまり使わないからいらないかも・・・)
5.応用編
エレメントの表示位置をドット単位で指定する
エレメントの表示位置は、ButtonメソッドやTextメソッドの引数「pad」で細かく指定することも可能です。ただし、指定する数値は、 表示ウィンドウの中でのx-y座標値ではありません 。そのエレメントが置かれる場所での、左からの位置(距離、ドット数)・右からの位置・上からの位置・下からの位置になります。
sg.Button('ボタン', pad=((左からの位置,右からの位置),(上からの位置,下からの位置)) )
padの右辺は、下記のように書くこともできます。その場合、第一要素が左および右からの位置、第二要素が上および下からの位置となります。
sg.Button('ボタン', pad=(左および右からの位置,上および下からの位置) )
プログラム例
import PySimpleGUI as sg
# ウィンドウのレイアウトlayout = [ [sg.Text("↓↓↓↓↓↓↓↓↓↓↓↓↓ 上側10 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓")], [sg.Text("左側50→"),sg.Button('ボタン1', pad=((50,20),(10,30))),sg.Text("←右側20")], [sg.Text("↑↑↑↑↑↑↑↑↑↑↑↑↑ 下側30 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑")], [sg.Text("↓↓↓↓↓↓↓↓↓↓↓↓↓ 上側50 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓")], [sg.Text("左側10→"), sg.Button('ボタン2', pad=(10,50)), sg.Text("←右側10")], [sg.Text("↑↑↑↑↑↑↑↑↑↑↑↑↑ 下側50 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑")]]
# ウィンドウオブジェクトの作成window = sg.Window('title', layout, size=(300, 350))
# イベントのループwhile True: # イベントの読み込み event, values = window.read() # ウィンドウの×ボタンクリックで終了 if event == sg.WIN_CLOSED: break
# ウィンドウ終了処理window.close()
出力例
半透明のウィンドウを作る
ウィンドウ定義の時に引数でalpha_channelの設定を追加すれば、半透明のウィンドウを作ることができます。
window = sg.Window('My window', layout, no_titlebar=True, alpha_channel=0.5)
その他、ゲーム、カメラ利用、動画再生、人工知能、グラフ化、テーマ(見た目)の変更などができます。詳細は公式ページを見てみてください。