「PyAutoGUI」を使っていると、ある画像が表示されるまで待機して、表示されたらクリックしたい、というケースに出くわします。
公式ドキュメントを読むと、びっくりするくらい簡単な方法が書かれていたので、それをまとめました。
画像をクリックするには?
完全一致であれば、「pyautogui.click()」の引数に検索したい画像ファイルのパスを指定するだけです。
import pyautogui
# pyファイルと同じフォルダに保存した「a.png」と完全一致した所をクリックする
pyautogui.click('a.png')
上記のコードは、内部でこのような処理を行っているそうです。
import pyautogui
# 画像の角4つの座標を取得する
img_location = pyautogui.locateOnScreen('a.png')
# 見つかった画像の中央の座標に変換する
img_x, img_y = pyautogui.center(img_location)
# 変換した座標をクリックする
pyautogui.click(img_x, img_y)
「pyautogui.locateOnScreen()」のオプションに「confidence」というものがあり、画像を見つける精度を指定できます。
つまり、似た画像もクリック対象にしたい場合は、「pyautogui.locateOnScreen()」で座標を見つけて、中央の座標に変換し、「pyautogui.click()」する流れです。
なお、「confidence」を使うには外部ライブラリ「OpenCV」がインストールされている必要があります。また指定する数値は何でも良いものの、「0 < n < 1」が実効のある範囲です。
import pyautogui
# 画像ファイルと似た所の座標を取得する
img_location = pyautogui.locateOnScreen('a.png',confidence=0.9)
# 見つかった画像の中央の座標に変換する
img_x, img_y = pyautogui.center(img_location)
# 変換した座標をクリックする
pyautogui.click(img_x, img_y)
画像が表示されるまで待つには?
「pyautogui.locateOnScreen()」は、画像が見つからなかった時に「None」を返します。
ゆえに、「while」と組み合わせることで画像が表示されるまで待つことができます。
import pyautogui
import time
while pyautogui.locateOnScreen('a.png',confidence=0.9) == None:
time.sleep(1)
複数の画像を認識したい場合は?
「pyautogui.locateOnScreen()」に代えて、「pyautogui.locateAllOnScreen()」を使います。
import pyautogui
for a in pyautogui.locateAllOnScreen('a.png',confidence=0.8):
print(a)
# ⇒ Box(left=〇, top=〇, width=〇, height=〇)
2番目に見つけた画像だけに処理をするには?
「pyautogui.locateAllOnScreen()」の戻り値に「list()」を使い、配列に変換すると可能です。
import pyautogui
a = pyautogui.locateAllOnScreen('a.png',confidence=0.7)
print(list(a)[1])
# ⇒ 2番目に見つかった画像の座標が取得できる
まとめ
Pythonで画像をクリックしたい場合は、「pyautogui.click('【画像ファイル名】')」の1行でできます。
似た画像は「pyautogui.locateOnScreen('【画像ファイル名】',confidence=)」で、認識できますし、複数の画像は「pyautogui.locateAllOnScreen()」を使えば操作できます。
画像ファイルの作成でつまづいたところがあって、スクリーンショットを切り抜いて作ったのに完全一致しないのはどういうことだ?と、悩んでいたら、使っていた画像編集ソフトが保存時に自動で圧縮をかけていたのが原因だった、というオチでした。
Pythonでパソコンを操作する【目次】