RPAツールのGUIを作りはじめました。ドキュメント読んだり、ググったりしながら3時間ぐらいで大枠はできました。
今回はGUI単体で動くものを作りました。後日RPAの機能を組込む予定です。
目次
1.PySimpleGUI
pythonでGUIを作ろうとするとよく出てくるモジュールです。python標準のtkinterよりコードの量が少なく、更にドキュメントが充実しているということで人気のようです。今回はこれを使って開発していきます。
2.外観
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.参考文献
Visual Studio CodeでPythonをデバッグ