PySimpleGUIを使ってGUIを作ってみた

投稿者: | 2021年3月31日

RPAツールのGUIを作りはじめました。ドキュメント読んだり、ググったりしながら3時間ぐらいで大枠はできました。

今回はGUI単体で動くものを作りました。後日RPAの機能を組込む予定です。

1.PySimpleGUI

pythonでGUIを作ろうとするとよく出てくるモジュールです。python標準のtkinterよりコードの量が少なく、更にドキュメントが充実しているということで人気のようです。今回はこれを使って開発していきます。

PySimpleGUI

2.外観

GUI

Nextの部分に次のミーティング開催の日付や時刻を表示させます。

その下のLogにどのような操作をしたかを出力します。これは予定取得をした場合などの確認に使う予定です。

一番下はツールを動かす、止める、ツールを終了するボタンです。

3.コード

4.参考にしたこと

4-1.ストップウォッチ

cookbookに載っているストップウォッチはtimeoutやボタンの扱いで参考にしました。

4-2.デザインの仕方

公式ドキュメントのThe window Designerを参考に作成しました。

4-3.VSCodeでのPythonのデバッグ

pdbを使うやり方もありますが、VSCodeの力を借りたほうがデバッグが楽でした。Pythonの拡張機能をインストールしているならば、デバッグタブからデバッガを動かすことができます。

Visual Studio CodeでPythonをデバッグ

5.躓いたこと

5-1.ループが回らない

You may find some PySimpleGUI programs that set the timeout value to zero. This is a very dangerous thing to do. If you do not pend on something else in your event loop, then your program will consume 100% of your CPU. Remember that today's CPUs are multi-cored. You may see only 7% of your CPU is busy when you're running with timeout of 0. This is because task manager is reporting a system-wide CPU usage. The single core your program is running on is likely at 100%.

A true non-blocking (timeout=0) read is generally reserved as a "last resort". Too many times people use non-blocking reads when a blocking read will do just fine or a read with a timeout would work.

It's valid to use a timeout value of zero if you're in need of every bit of CPU horsepower in your application. Maybe your loop is doing something super-CPU intensive and you can't afford for the GUI to use any CPU time. This is the kind of situation where a timeout of zero is appropriate.

Be a good computing citizen. Run with a non-zero timeout so that other programs on your CPU will have time to run.

timeout=0はCPUのリソースをずっと専有するのでコンピュータに良くないという感じです。

また、引数がない場合はノンブロッキングとして扱われます。

ノンブロッキングは”ある処理をしている間も処理は進むが、その処理が終わらないとできない処理になったら中断して待つ”ことです。

今回の場合は、ループが1回回ってもう一度read関数を呼びましたが、処理が終わっていないので待機します。(デバッガで動きを追ったらそこで止まったので)

何が終わっていないのかはよくわかりませんが、とにかくtimeoutは明示したほうがよさそうです。ただし、10ms以下のtimeoutは絶対にやるな、らしい。

Do Not use a timeout of less than 10ms. Otherwise you will simply thrash, spending your time trying to do some GUI stuff, only to be interruped by a timeout timer before it can get anything done. The results are potentially disasterous.

5-2.Invalid format string

出力する値を形式を変えて出力しようとしたところ出ました。windows環境ではエラーが出るようです。

Pythonでエポック秒(UNIX時間)を取得する時の注意点

現在日時文字列を取得する方法

6.おわりに

RPAを組み込めば終わりそうです。

あまりに久しぶりに使ったもので、予定取得するモジュールをどうするんだっけ?となったり、なぜか画像認識用の画像が消えていたりとあたふたしました。

さっさと完成させて、ドキュメント作成しよう。

7.参考文献

PySimpleGUI

Visual Studio CodeでPythonをデバッグ

Pythonでエポック秒(UNIX時間)を取得する時の注意点

現在日時文字列を取得する方法

ノンブロッキング(non-blocking)

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください