PyAutoGUIで処理待ちをする3つの方法

PyAutoGui

みなさん,こんにちは.
シンノユウキ(@y_stadio)です.

今回は,PythonのGUI自動化ライブラリ:PyAutoGUIにて,処理待ちを攻略するための方法を紹介します.

何らかのプロセスを自動化していると,どうしても処理待ちをしなければならない状況が出てきます.人間だと簡単なのですが,機械にそれをさせる場合,少し工夫が必要になってきます.今回はそれを攻略するための3つの方法をお伝えできればとおもいます.

では行きましょう!

処理待ちってどういう状況?

始めに,「処理待ち」って言われてもどのような状況かピンとこない,という方に簡単な例を紹介したいと思います.

たとえば,あるボタンをクリックして,コンピュータ側で何らかの処理をし,処理が終わったらまたボタンをクリックする,といったプロセスを自動化したい場合.この際にコンピュータ側での処理が終わる前にまたボタンをクリックするのはよろしくありませんので,処理が終わった時をコンピュータ側で認識し,その後にボタンをクリックする必要があります.

人間だと簡単な処理でも,機械にそれをやらせるのには工夫がいります.以下でその方法を紹介します.

①ひたすら待つ

最も簡単なのはひたすら待つことです.コンピュータに処理をさせて,それに必要な時間がある程度不確かなものであっても,おおむね把握できるはずです.まさか30秒で終わる時もあれば30分かかる時もある,ということは無いでしょう.どうせ機械が勝手にやっているだけです.少し位多めに待たせても問題ないはずです.

これにはtimeモジュールのsleep関数を使うと便利です:

import pyautogui as pg
from time import sleep

for i in range(2):
    # 何らかの処理
    sleep(5)

sleep関数の引数は“秒”で指定します.この場合だと5秒になります.ただ指定された秒数待つだけなので,コードは非常にシンプルです.ただし,処理がこの時間内に終わらなかった場合は誤動作の原因になるので,少し長めに時間を取っておくと良いでしょう.

②もはや人間が判断する

機械が判断するのが難しいなら,もはや人間が判断すればいいじゃない?というのがコレです.妥協案といえばそうですが,意外と重宝します.処理後の認識がかなり面倒だけど,一部の操作だけでも自動化したいなぁという場合,仕事は待ってくれませんので,これも一つのオプションです.

これには,PyAutoGUIのMessageBox関数を使用します.これを使用することで,任意の段階でメッセージボックスを出すことができ,Python側の処理を中断・再開させることができます.

import pyautogui as pg

for i in range(2):
    #  何らかの処理
    pg.alert(text='処理が終わったらクリック', button='OK')
    # 再開後の処理

上記のコードを実行すると,何らかの処理が終わった段階で,以下のアラートが画面上に表示されます.

処理が終わった段階で「OK」をクリックすると,再開後の処理から,また処理を始めることができます.

③終了後の画面を画像認識

せっかく自動化するのなら,人間の目じゃなくてコンピュータに判断させたい.でもsleep関数使うのもスマートじゃないなぁという場合.PyAutoGUIの画像認識機能であるScreenshot機能を活用しましょう.

PyAutoGUIは,予め保存しておいた画像を,現在の画面から探し出すことができます.なので,処理が終わった際などに画面に表示される画像を予め画像ファイルなどとして取得しておけば,それが画面内に表示された段階で処理が終わったものとみなせば良いということになります.

コードとしては以下のようになります:

import pyautogui as pg
from time import sleep

for i in range(2):
    # 何らかの処理
    # 処理待ち
    for tryCount in range(30):
        try: 
            if pg.locateOnScreen('finish.png'):
                break
        except ImageNotFoundException: 
            sleep(1)
    # 処理後の処理

pg.locateOnScreen('finish.png')を30回までtryして,もし画面内に画像が見つかればループを抜け,処理後の処理に移行します.画像が見つからない(処理が終わってない)際は,ImageNotFoundExceptionのエラーを吐き出しますので,それをキャッチし1秒スリープします.トライは30回まで行うこととしています.

わざわざFor inを使わなくても,Whileの終わるまでループでもいいのですが,もし予想外のことが起こった際に面倒なことになるので,トライは30回までとしています.もしもう少し時間が必要な場合は,トライの回数を増やしたり,スリープの時間を伸ばしたり,また処理後に一定のスリープを入れてもいいかもしれません.

まとめ

今回はPyAutoGUIで処理待ちをする3つの方法を紹介しました.ちなみに,私は実務で3種類全てを使い分けています.3ができれば最高なのですが,なんだかんだ2が一番多かったりします.1は少し怖いので簡単な処理前提ですね.参考になれば!

タイトルとURLをコピーしました