待機させてからクリックする方法
同期や取得などで、待ち時間が発生する場合、通常ならtime.sleepを使いますが、変に間延びしてしまうこともしばしば。
それよりも、処理が完了したあと、「対象の画像が出てきたときにクリックする」と条件指定し、それまで待機させてからクリックする方が、何かとスムーズ。
そのため、対象の画像が表示されれば、クリック、それ以外の場合は、待機しておく。
というコードを書きました。
Pyoutgui をimportする
import pyautogui as pg
まずはインポートする
画像をクリックする方法
ますは、画像クリックだけの関数を作りました。ImageClickという関数にしています。パスのところへクリックしたい画像のパスを入れます。
パスにある、サンプルというPNGの画像を認識すれば、それをクリックする。という内容です。
※画像はキャプチャを撮ってパスで指定している場所に保存するだけでオッケーです。
これは、待機時間に関係なく、画像をクリックしてしまいます。
画像があったらクリック。なければパスして、次の処理に進んでしまいます。
import pyautogui as pg
def ImageClick(path):
image = pg.locateOnScreen(path , confidence=0.9)
if image is None:
pass
elif image is not None:
pg.click(image)
else:pass
ImageClick(r"C:\Users\oono\Desktop\python\PNG\sample.png")
表示されるまで待機して表示されたときだけクリックする方法
指定した画像がある場合、クリックして次の処理へ(breakさせる)
画像がない場合は、何もしない。このループです。
待ち時間が長い処理の時、sleep.time()を長時間使わなくても、完了のポップアップなどが出てきたときに、クリックする。ということが可能になりました。
import pyautogui as pg
def WaitClick(path):
while True:
image = pg.locateOnScreen(path, confidence=0.9)
if image is None:
pass
elif image is not None:
time.sleep(5)
pg.click(image)
pg.click(image)
break
else:pass
WaitClick(r"C:\Users\oono\Desktop\python\PNG\sample.png")
まとめ
苦労したのは、if image is None のところ。
本来なら、画像があれば、クリックして、なければ、、、という書き方をしたかったのですが、Trueというのがなく、None としか反応しないので、画像がある場合を、is not Noneとしか書けずに、あれ?Noneでクリック? is not None でクリック?
となって、ややこしかったです。
もうひとつは、0.9の所です。0.6だと違う画像をクリックしてしまうし、0.9なら反応しないし、不安定な感じでした。
でもとりあえず動いたし、処理も止まってくれるし、よかったです。
実際に使うときには
関数をpyguidef.pyというファイルに書いておいて別の処理ファイルを用意して、from pyguidef import ImageClick,WaitClick
としておいて、WaitClick(画像のパス)
という形で使っています。ごちゃごちゃしないので、使いやすいです。