Why it doesn't work?

作業のメモ、記録をブログに残しています。

Python マウスとキーボードを制御する(スクリーンショット機能による画面操作)

f:id:zakiyamatakashi:20181005164322p:plainPython マウスとキーボードを制御する(マウスの移動) - Why it doesn't work?
Python マウスとキーボードを制御する(マウスのクリック) - Why it doesn't work?
Python マウスとキーボードを制御する(キーボードの制御) - Why it doesn't work?
まだ続きます。
今回は、PyAutoGUIが提供するスクリーンショット機能を利用して座標位置の取得し、その座標を元に画面操作を行ってみたいと思います。
公式を参照に電卓機で計算を実行してみます。

1. 事前準備

事前準備として、まずは、公式と同じように必要なキーの画像を取得します。画像の右側がそれぞれの画像のファイル名とします。
f:id:zakiyamatakashi:20181005164212p:plain calc_key7.png
f:id:zakiyamatakashi:20181005164257p:plain calc_key9.png
f:id:zakiyamatakashi:20181005164311p:plain calc_keyAst.png
f:id:zakiyamatakashi:20181005164322p:plain calc_keyEqual.png

2. 対象の画像の位置を取得する

計算機を立ち上げた状態で、まずは、それぞれの画像と一致する座標位置を取得します。取得できるタプルは、検知した画像の左側のX座標、上側のY座標、幅、高さの4つの数値を含みます。

>>> import pyautogui
>>> button7location = pyautogui.locateOnScreen('calc_key7.png')
>>> button7location
(959, 481, 43, 34)
>>> button9location = pyautogui.locateOnScreen('calc_key9.png')
>>> button9location
(1039, 482, 39, 33)
>>> buttonAlocation = pyautogui.locateOnScreen('calc_keyAst.png')
>>> buttonAlocation
(1078, 514, 39, 32)
>>> buttonEqlocation = pyautogui.locateOnScreen('calc_keyEqual.png')
>>> buttonEqlocation
(1116, 546, 41, 65)

3. 検知した画像の中心座標の取得

次に、それぞれの画像の中心座標を求めます。

>>> button7x, button7y = pyautogui.center(button7location)
>>> button7x, button7y
(980, 498)
>>> button9x, button9y = pyautogui.center(button9location)
>>> button9x, button9y
(1058, 498)
>>> buttonAx, buttonXy = pyautogui.center(buttonAlocation)
>>> buttonAx, buttonAy
(1097, 530)
>>> buttonEx, buttonEy = pyautogui.center(buttonEqlocation)
>>> buttonEx, buttonEy
(1136, 578)

4. 検知した画像のクリック

取得した座標を元にclick()関数を実行します。

>>> pyautogui.click(button7x, button7y)
>>> pyautogui.click(buttonAx, buttonAy)
>>> pyautogui.click(button9x, button9y)
>>> pyautogui.click(buttonEx, buttonEy)

答えが正しく表示されました。
f:id:zakiyamatakashi:20181005165424p:plain

ちなみに、2と3は以下のコマンドでも同じ結果となります。ケースバイケースで使い分けましょう。

>>> buttonEx, buttonEy = pyautogui.locateCenterOnScreen('calc_keyEqual.png')
>>> buttonEx, buttonEy
(1136, 578)

スクリーンショット機能には、まだ他にも多くの機能がありますが、とりあえずは今回でPyAutoGUIのシリーズは一旦終了です。