今回はPythonでデスクトップGUIアプリケーションを実装する方法について書きたいと思います。
やりたいこと
現在、当サイトで製作しているRaspberry Piベースのスパイダーロボット、PiCrawlerの動作をコントロールするアプリケーションは、ターミナルからテキストを入力して指令を送るアプリケーションを使用しています。
しかし、マルチプロセスで複数の処理をしようとすると、ターミナルからの指令を受け取れなくなってしまいました。(試行錯誤したのですが、現在はまだ解決方法が見つかっていません)
マルチプロセスでの制御は以前記事にしています。
![](https://murasan-net.com/wp-content/uploads/2022/02/sg843c-300x225.jpg)
そこで、コントローラー画面のようなGUIアプリケーション作成し、そのGUIを介してロボットに「前進」、「回転」などの動作に関する指令を与えられるようにしたいと思います。
PySimpleGUI
今回、GUIの実装するにあたり、「PySimpleGUI」というライブラリを使用することにしました。GUIを作成するためのライブラリをいくつか調べたのですが、レイアウト構造を定義する際の記述が一番直感的に実装できる感じがしました。PySimpleGUIはPythonの標準ライブラリ「Tkinter」がベースとなっています。(ラッパーライブラリ)
![](https://murasan-net.com/wp-content/plugins/pochipp/assets/img/pochipp-logo-t1.png)
インストール
PySimpleGUIをインストールします。
ターミナルで以下のコマンドを実行します。
pip3 install PySimpleGUI
以上でインストールは完了です。
レイアウトを定義する
実際に作成した画面を出してしまいますが、以下が作成したい画面の画像です。ウィンドウ上に「前進」「右回転」など、ロボットの動作指示をするためのボタンが並んでいます。
ウィンドウのオブジェクトに番号を振っておきました。
![](https://murasan-net.com/wp-content/uploads/2022/02/gui001a.jpg)
以下が画面レイアウトを定義している部分のソースコードです。
先ほどのウィンドウ上のオブジェクト番号と、画像レイアウトの定義部分のコードに振られたオブジェクト番号が対応関係を表しています。
![](https://murasan-net.com/wp-content/uploads/2022/02/005.jpg)
このように作りたい画面構成をそのままコードで定義していくだけでGUIを実装することができます。
レイアウトの定義方法は以下のサイトが詳しく解説されていますので、ご参考にしてみてください。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-412672c5f0600ab9a64263b751f1bc81.png?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTk3MiZoPTM3OCZ0eHQ9UHl0aG9uJUU3JTk0JUJCJUU1JTgzJThGJUU1JTg3JUE2JUU3JTkwJTg2JUUzJTgxJUFFJUUzJTgxJTlGJUUzJTgyJTgxJUUzJTgxJUFFR1VJJUU1JTg1JUE1JUU5JTk2JTgwJUVGJUJDJTg4UHlTaW1wbGVHVUklRTglQTclQTMlRTglQUElQUMlRUYlQkMlODkmdHh0LWFsaWduPWxlZnQlMkN0b3AmdHh0LWNvbG9yPSUyMzIxMjEyMSZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT01NiZzPWY2YjIyYTljNjM4MTcxOGNmMmVkZTVkZDQ3NzdjYjhh&mark-x=142&mark-y=57&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZoPTc2Jnc9NzcwJnR4dD0lNDBzdW5hbWVyaTIyJnR4dC1jb2xvcj0lMjMyMTIxMjEmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9MzYmdHh0LWFsaWduPWxlZnQlMkN0b3Amcz03NzQ3YmZiMTcxZjZiNWJhNzFmNGIzMWUwYmVjODlkNA&blend-x=142&blend-y=486&blend-mode=normal&s=972c355b1bccbf167219c7acebfbed0f)
![](https://murasan-net.com/wp-content/plugins/pochipp/assets/img/pochipp-logo-t1.png)
作成したソースコード
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プログラムを実行すると、以下のような画面が表示されます。
![](https://murasan-net.com/wp-content/uploads/2022/02/gui001.jpg)
「前進」ボタンをクリックした場合は、以下のようなウィンドウが表示されます。
![](https://murasan-net.com/wp-content/uploads/2022/02/gui002.jpg)
「前進します」というポップアップが表示されました。(将来的にはここでポップアップではなく、前進という要求を姿勢制御アプリに通知する処理が実行されるようなプログラムに拡張します)
「終了」ボタンをクリックした場合は以下のようになります。
![](https://murasan-net.com/wp-content/uploads/2022/02/gui003.jpg)
「終了します」というポップアップが表示され、ウィンドウが閉じます。
![](https://murasan-net.com/wp-content/plugins/pochipp/assets/img/pochipp-logo-t1.png)
プログラミングのスキルを活かすには
プログラミングのスキルを仕事に活かすには、フリーランスとして受けられる案件がおすすめです。
![](http://image.moshimo.com/af-img/2225/000000069940.png)
テックゲートフリーランスは、フリーランスエンジニアの案件紹介や契約交渉・債権管理などのサポートを行っているフリーランスエージェントです。
- リモートワーク可能な案件が50%以上
- 週3〜4日の案件の豊富さ
- 年収100万円アップのサポート
無料相談フォームからご登録いただくだけで、経験年数やスキルに合わせて案件をご紹介。また、リモートワーク可能な案件や週3〜4日OKの案件も豊富に用意されています。
副業やフリーランスとして仕事を受けてみたいと考えている方には、テックゲートフリーランスが提供する多様なサポートが非常におすすめです。
\ 無料で登録してみる! /
まとめ
いかがだったでしょうか?
PySimpleGUIを使用すると、直感的にレイアウトを実装していくことができます。今回はテキストラベルとボタンだけのGUIでしたが、入力可能なテキストボックス、スライダー、コンボボックスなど色々なオブジェクトが用意されていますので、複雑な画面も構築が可能です。
また、以下の記事で効率的にPythonのプログラミングスキルを学べるプログラミングスクールの選び方について解説しています。最近ではほとんどのスクールがオンラインで授業を受けられるようになり、仕事をしながらでも自宅で自分のペースで学習できるようになりました。
スキルアップや副業にぜひ活用してみてください。
![](https://murasan-net.com/wp-content/uploads/2023/01/startup-593324_1280-300x200.jpg)
スクールではなく、自分でPythonを習得したい方には、いつでもどこでも学べる動画学習プラットフォームのUdemyがおすすめです。
講座単位で購入できるため、スクールに比べ非常に安価(セール時1200円程度~)に学ぶことができます。私も受講しているおすすめの講座を以下の記事でまとめていますので、ぜひ参考にしてみてください。
![](https://murasan-net.com/wp-content/uploads/2023/01/computer-6977449_1920-300x200.jpg)
それでは、また次の記事でお会いしましょう。
![](https://murasan-net.com/wp-content/plugins/pochipp/assets/img/pochipp-logo-t1.png)
![](https://murasan-net.com/wp-content/plugins/pochipp/assets/img/pochipp-logo-t1.png)
参考
![](https://news.mynavi.jp/techplus/article/zeropython-73/index_images/index.jpg)
コメント