5
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

SuiSuiAdvent Calendar 2023

Day 6

作業自動化に使えるPyAutoGUI紹介 【スクショ・指定画像位置検知】

Last updated at Posted at 2023-11-28

はじめに

前回に引き続き,自作RPAツールとして利用できる「PyAutoGUI」について紹介していきます.

「マウス操作」「キーボード操作」のコマンドはこちら
作業自動化に使えるPyAutoGUI紹介①

PyAutoGUIとは

Pythonスクリプトでマウスとキーボードを制御して,「マウス操作の自動化」や「キーボード入力の自動化」を実現します.

動作環境

  • Python 3.12.0
  • PyAutoGUI 0.9.54

PyAutoGUIはpipを使用してインストールできます.

pip install pyautogui

コマンド紹介

【メッセージボックス機能】

  • alert()
    テキストと1つのOKボタンを持つシンプルなメッセージボックスを表示します.クリックされたボタンのテキストを返します.
import pyautogui as pag

pag_alert = pag.alert(text='pyautogui', title='qiita', button='OK')
print(pag_alert) # 出力は「OK」

[実行結果]

image.png


  • verify()
    メッセージボックスにOKボタンとキャンセルボタンを表示します.ボタンの数とテキストはカスタマイズできます.クリックされたボタンのテキストを返します.
import pyautogui as pag

pag_confirm = pag.confirm(text='pyautogui', title='qiita', buttons=['OK', 'Cancel'])
print(pag_confirm) # 出力はOKボタンを押すと「OK」,Cancelボタンを押すと「Cancel」

[実行結果]

image.png


  • prompt()
    テキスト入力のメッセージボックスと,「OK」と「キャンセル」ボタンを表示します.OKが押された場合は入力されたテキスト,キャンセルがクリックされた場合はNoneを返します.
import pyautogui as pag

pag_prompt = pag.prompt(text='pyautogui', title='qiita' , default='')
print(pag_prompt) # OKを押した場合,入力ボックスに入力した文字列,Cancelを押した場合,Noneを返す

[実行結果]

image.png
prompt関数のdefaultに文字列を入力すると,メッセージボックス起動後,入力ボックス内に設定した文字列が初期状態として記入されます.文字列を設定しなければ,空欄の状態で起動します.


  • password()
    テキスト入力が可能なメッセージボックスと,「OK」「キャンセル」ボタンを表示します.UI上では入力された文字は*と表示されます.OKが押された場合は入力されたテキスト,キャンセルがクリックされた場合はNoneを返します.
import pyautogui as pag

pag_password = pag.password(text='pyautogui', title='qiita', default='', mask='*')
print(pag_pasword) # OKを押した場合,入力ボックスに入力した文字列,Cancelを押した場合,Noneを返す

[実行結果]

image.png

↓文字列入力

image.png

password関数もprompt関数同様のdefault設定になります.
文字列入力後の伏せ字は第四引数のmaskで変更できます.


【スクリーンショット機能】

  • screenshot()
    screenshot()を呼び出すと,Imageオブジェクトが返されます.ファイル名の文字列を渡すと,スクリーンショットをファイルに保存し,Image オブジェクトとして返します.
import pyautogui as pag

im1 = pag.screenshot()
im2 = pag.screenshot(r"C:\Qiita\test.png")

画面全体のスクリーンショットを取得したくない場合は,オプションでregionキーワード引数を指定することもできる.キャプチャする領域のleft、top、width、heightの4整数のタプルを渡して設定する.

import pyautogui as pag

im = pag.screenshot(region=(0, 0, 300, 400))

【Locate機能】

画像ファイルがあれば,画面上の何かを視覚的に見つけることができます.例えば,下図の「ブラウザを閉じるボタン」の画像があれば,ブラウザがどの位置に存在していても「閉じるボタン」の座標を取得することができ,click()などと併用して操作を自動化することが可能です.

image.png


  • locateOnScreen()
    locateOnScreen()は指定した画像がスクリーンに表示されている場合,座標を取得します.戻り値は4変数のタプル(left, top, width, height)です.スクリーン上に指定画像と同じ絵が見つからない場合,ImageNotFoundExceptionを発生させます.

locateOnScreen()で取得したタプルをcenter()に渡すことで,この領域の中心のX座標とY座標を得ることができます.

import pyautogui as pag

location_closeButton = pag.locateOnScreen('close.png')
location_closeButton
# -> Box(left=1400, top=500, width=50, height=40)
location_closeButton[0]
# -> 1400 
location_closeButton.left
# -> 1400

point_closeButton = pag.center(location_closeButton)
point_closeButton
# -> Point(x=1425, y=520)
point_closeButton[0]
# -> 1425
point_closeButton.x
# -> 1425

# 指定した画像と同じ絵をクリック
button_x, button_y = point_closeButton
pag.click(button_x, button_y) # 閉じるボタンがあった場所の中央をクリック
pag.click('close.png') # 閉じるボタンがあった場所の中央をクリックするショートカット版

オプションのconfidenceキーワード引数は,関数が画面上の画像の位置を特定する精度を指定します.confidenceキーワードが機能するためには,OpenCVがインストールされている必要があります.

import pyautogui as pag

location_closeButton = pag.locateOnScreen('close.png', confidence=0.9)

  • locateCenterOnScreen()
    文字通り,locateOnScreen()とcenter()を組み合わせたものです.
import pyautogui as pag

x, y = pag.locateCenterOnScreen('close.png')
pag.click(x, y)

  • locateAllOnScreen()
    locateAllOnScreen()は指定した画像がスクリーン上にある場合,それら全ての座標(4変数のタプル)を返します.forループで使用したり,listに渡すことができます.
import pyautogui as pag

for pos in pag.locateAllOnScreen('someButton.png')
    print(pos)

list(pyautogui.locateAllOnScreen('someButton.png'))

locate関数は実行に長い時間を要することがあります.
これを避けるためには,region引数を設定して画面全体の検索ではなく一部のみの検索にすることです.


  • グレースケールマッチング
    オプションとして,locate関数にgrayscale=Trueを渡すことで,若干(約30%程度)のスピードアップを図ることができます.画像やスクリーンショットの色が減色され,検索速度が速くなりますが,誤判定を引き起こす可能性があるため注意が必要です.
import pyautogui as pag

location_closeButton = pag.locateOnScreen('close.png', grayscale=True)

  • ピクセルマッチング
    スクリーンショットのピクセルのRGBカラーを取得します.
import pyautogui as pag

im = pag.screenshot()
im.getpixel((100, 200))
# -> (130, 135, 140)

または,1つの関数としてpixel() PyAutoGUI関数を呼び出します.

import pyautogui as pag

pix = pyautogui.pixel(100, 200)
pix
# -> RGB(red=130, green=135, blue=140)
pix[0]
# -> 130
pix.red
# -> 130

pixelMatchesColor()を使用して,1つのピクセルが指定されたピクセルと一致するかを判定できます.戻り値はTrue/Falseです.

import pyautogui as pag

pag.pixelMatchesColor(100, 200, (130, 135, 140)) # 座標(100, 200)のRGB値が(130, 135, 140)と同じか
# -> True
pag.pixelMatchesColor(100, 200, (0, 0, 0)) # 座標(100, 200)のRGB値が(0, 0, 0)と同じか
# -> False

オプションのtoleranceキーワード引数は,赤,緑,青の各値が一致しながらどの程度変化するかを指定します.

import pyautogui as pag

pag.pixelMatchesColor(100, 200, (130, 135, 144))
# -> True
pag.pixelMatchesColor(100, 200, (140, 125, 134))
# -> False
pag.pixelMatchesColor(100, 200, (140, 125, 134), tolerance=10)
# -> True
5
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?