【Python】PySimpleGUIでデスクトップGUIアプリケーションを作成する

  • URLをコピーしました!

今回はPythonでデスクトップGUIアプリケーションを実装する方法について書きたいと思います。

目次

やりたいこと

現在、当サイトで製作しているRaspberry Piベースのスパイダーロボット、PiCrawlerの動作をコントロールするアプリケーションは、ターミナルからテキストを入力して指令を送るアプリケーションを使用しています。

しかし、マルチプロセスで複数の処理をしようとすると、ターミナルからの指令を受け取れなくなってしまいました。(試行錯誤したのですが、現在はまだ解決方法が見つかっていません)
マルチプロセスでの制御は以前記事にしています。

そこで、コントローラー画面のようなGUIアプリケーション作成し、そのGUIを介してロボットに「前進」、「回転」などの動作に関する指令を与えられるようにしたいと思います。

PySimpleGUI

今回、GUIの実装するにあたり、「PySimpleGUI」というライブラリを使用することにしました。GUIを作成するためのライブラリをいくつか調べたのですが、レイアウト構造を定義する際の記述が一番直感的に実装できる感じがしました。PySimpleGUIはPythonの標準ライブラリ「Tkinter」がベースとなっています。(ラッパーライブラリ)

インストール

PySimpleGUIをインストールします。
ターミナルで以下のコマンドを実行します。

pip3 install PySimpleGUI

以上でインストールは完了です。

レイアウトを定義する

実際に作成した画面を出してしまいますが、以下が作成したい画面の画像です。ウィンドウ上に「前進」「右回転」など、ロボットの動作指示をするためのボタンが並んでいます。
ウィンドウのオブジェクトに番号を振っておきました。

以下が画面レイアウトを定義している部分のソースコードです。
先ほどのウィンドウ上のオブジェクト番号と、画像レイアウトの定義部分のコードに振られたオブジェクト番号が対応関係を表しています。

このように作りたい画面構成をそのままコードで定義していくだけでGUIを実装することができます。

レイアウトの定義方法は以下のサイトが詳しく解説されていますので、ご参考にしてみてください。

作成したソースコード

Pythonで作成したソースコードは以下の通りです。

import PySimpleGUI as psg
from time import sleep

#レイアウト
layout = [
    [psg.Text("ロボットの動作を選択してください")],
    [psg.Button("前進", size=(15, 1), key="BTN_FORWARD")],
    [psg.Button("左回転", size=(7, 1), key="BTN_LEFT"),psg.Button("右回転", size=(7, 1), key="BTN_RIGHT")],
    [psg.Button("後退", size=(15, 1), key="BTN_BACKWARD")],
    [psg.Button("終了", size=(7, 1), key="BTN_EXIT")]]
    
#ウインドウを表示
win = psg.Window('コントロールパネル', layout)

while True:
    event, values = win.read()
    if event is None: break
    if event == "BTN_FORWARD":
        psg.popup("前進します")
    elif event == "BTN_LEFT": 
        psg.popup("左回転します")
    elif event == "BTN_RIGHT":
        psg.popup("右回転します")
    elif event == "BTN_BACKWARD":
        psg.popup("後退します")
    elif event == "BTN_EXIT":
        psg.popup("終了します")
        break
        
    sleep(0.05)

6行目:
レイアウトを定義します。

14行目:
ウィンドウをオープンします。

17行目:
ウィンドウの情報を取得します。ここでもしボタンがクリックされていると、レイアウトで定義したオブジェクトの「key」の値が「event」に格納されます。

20行目:
クリックされたボタンの種類によって処理を切り分けます。

29行目:
「終了」のボタンがクリックされた場合は、ループを抜けてアプリケーションを終了します。

実行結果

作成したPythonプログラムを実行すると、以下のような画面が表示されます。

「前進」ボタンをクリックした場合は、以下のようなウィンドウが表示されます。

「前進します」というポップアップが表示されました。(将来的にはここでポップアップではなく、前進という要求を姿勢制御アプリに通知する処理が実行されるようなプログラムに拡張します)

「終了」ボタンをクリックした場合は以下のようになります。

「終了します」というポップアップが表示され、ウィンドウが閉じます。

まとめ

いかがだったでしょうか?
PySimpleGUIを使用すると、直感的にレイアウトを実装していくことができます。今回はテキストラベルとボタンだけのGUIでしたが、入力可能なテキストボックス、スライダー、コンボボックスなど色々なオブジェクトが用意されていますので、複雑な画面も構築が可能です。

それでは、また次の記事でお会いしましょう。

参考

よかったらシェアしてね!
  • URLをコピーしました!
目次