pyAutoGui 基本

投稿者: | 2022-01-26

目次

基本

import pyautogui as pag

# マウス位置
x, y = pag.position()

# 解像度
pag.size()

# GUI操作毎のポーズ秒数(デフォルト:0.1s)
pag.PAUSE = 2.5

# フェールセーフを有効にする(デフォルト:有効)
# 有効の場合、座標(0,0)で例外が起き強制終了になる
# ただし、手動でカーソルを移動させる時間(ポーズ)の設定が必要
pag.FAILSAFE = True or False

# 有効時の例外処理
try:
  print('強制終了したい場合は、n秒以内にカーソルを画面左上に移動してください')
  処理
except pag.FailSafeException as e:
  print('フェールセーフ例外が発生しました。処理を中断します')
  print(e)

マウス操作

マウスの移動(絶対座標)

  • pag.moveTo(x, y, 移動時間, トゥイーン指定)
  • 移動時間
  • 最小値 0.1〜
  • pag.MINIMAMU_DURATIONで確認可能
メソッド説明
pag.easeInQuad開始は遅く、終了は早く
pag.easeOutQuad開始は早く、終了遅く
pag.easeInOutQuad開始と終了は早く、途中は遅い
pag.easeInBounce終了の時にバウンドする
pag.easeInElastic輪ゴムを伸ばして話したような動き
# 座標に移動
pag.moveTo(100, 100)

# 2秒かけて移動
pag.moveTo(200, 200, 2)

# 5秒かけてXのみ移動
pag.moveTo(500, None, 5)

# 開始は遅く、終了は早い
pag.moveTo(None, 100, 5, pag.easeInQuad)

マウスの移動(相対座標)

  • pag.moveRel(x, y, 移動時間, トゥイーン指定)
  • moveRelは相対的に指定するため、左に移動する場合はxはマイナス値、上に移動する場合はyはマイナス値になる
# 画面サイズを取得
w, h = pag.size()

# 真ん中に移動
pag.moveTo(w/2, h/2)

# 上に画面の高さ1/4分移動する
pag.moveRel(None, -(h/4), 3)

マウスのドラッグ(絶対・相対座標)

  • pag.dragTo or dragRel(x, y, 移動時間, button='left or right')
  • buttonはマウスの左右クリックをしながらドラッグする
# 現在の位置から以下の絶対的な座標までドラッグ
pag.dragTo(600, 300)

# 現在の位置から相対的に右クリックしながらドラッグ
pag.dragRel(-250, 200, button='right')

マウスのクリック

  • pag.click(x, y, args)
  • 注意:macの場合はなぜか座標を1/2にしないといけない?(確認中)
引数説明
x, yクリック前に移動するx,y座標
buttonクリックするボタン(’left’, ‘right’)
clicksクリック回数
intervalクリック間隔
  • pag.doubleClick(x, y, button='', interval=*)
  • pag.rightClick(x, y)
# ダブルクリック
pag.click(clicks=2)
pag.doubleClick()

# 座標に移動し、0.7秒間隔でダブルクリック
pag.click(x=600, y=500, clicks=2, interval=0.7)
pag.doubleClick(x=600, y=500, interval=0.7)

マウスダウン/アップ

  • pag.mouseDown(args)
  • pag.mouseUp(args)
引数説明
x, yクリック前に移動する座標
buttonクリックするボタン(’left’, ‘right’)

スクロール

  • pag.scroll(スクロール分の数値)
  • アップ:正の数値、ダウン:負の数値
pag.scroll(1000)

キーボード操作

  • pag.typewrite() ←古い
  • pag.write()
# 文字入力
pag.write('abcde')

# 3秒間隔でタイピング
pag.write('hello', interval=3)
  • pag.press(キー表記)
    • 押して、離す、が1セット
  • pag.keyDown(キー表記)
    • 押しっぱなし
  • pag.keyUp(キー表記)
    • 離す
# 例

# 左に移動(左矢印)
pag.press('left')

# pressのキー表記はリストでも可
pag.press(['left','left','left','left'])

# Ctrlキーを押しながら、cキーを押して、ctrlキーを離す
pag.keyDown('ctrl')
pag.press('c')
pag.keyUp('ctrl')
  • pag.hotkey(キー表記, キー表記, ....)
# ctrl + c
pag.hotkey('ctrl', 'c')

# ファイル名を指定して実行
pag.hotkey('win', 'r')

# ブラウザのタブ切り替え
pag.hotkey('ctrl', 'tab')
# キーの一覧表示
pag.KEYBOARD_KEYS

KEYBOAD_KEYS

日本語の入力

  • 日本語を直接打つことはできないため、クリップボード経由でペーストする
# 日本語を入力
import pyperclip
pyperclip.copy('日本語を入力する')
pag.hotkey('ctrl', 'v')

# TABキーを10回押す
for in in range(10):
  pag.hotkey('tab')

# 日本語入力で変数を混ぜる
n = 5
pyperclip.copy(n + '回目のループです')
pag.hotkey('ctrl', 'v')

スクリーンショット機能/画像認証

スクリーンショットの取得

  • pag.screenshot()
img_sc = pag.screenshot()
print(img_sc)
image-20220125222735159
# 引き数にファイルPATHを渡せば、そこに保存もできる
# 保存してもimgオブジェクトはimg_scに格納されている
img_sc = pag.screenshot('c:¥***¥img_sc.png')

# 引数regionで領域を指定してキャプチャもできる
img_sc = pag.screenshot('img_sc.png', region=(300,300,500,400))

# 以下の書き方でも保存できる
img_sc = pag.screenshot()
img_sc.save('img_sc.png')

# img_scの領域を指定(x, y, h, w)してクロップする
img_sc_crop = img_sc.crop((300,300,800,700))
img_sc_crop.save('img_sc_crop.png')

画像認証

  • pathlibのPosixPathは使えない
  • confidence のオプションを使う場合は、open-cvが必要
python -m pip install opencv-python
  • Macの解像度は「1440×900(WXGA)」(デフォルト)
  • 本体のディスプレイにある画像は見つけられるが、外部ディスプレイ側の画像は見つけられない?
  • pyautuguiで見つけた時の座標が「Box(left=1854、…」等、Mac解像度の領域外として検出されてしまう?(外部モニターを外しても同様)
  • 見つけたい画像をlocateCenterOnScreenメソッドに渡し、見つかった画像の領域を受け取って、座標を取得する
  • 画像はPNGがよい(JPGだと見つからない?)
  • 画像のサイズは実際のサイズと同じである必要がある(?)
  • 探すのに時間がかかる….マルチディスプレイだとさらに。
  • pag.locateOnScreen(探索画像ファイルのPATH, region=(x, y, h, w), grayscale=)

マウスの座標を調べる

  • 座標を調べるアプリを使う必要はない
  • マウスを置いた状態で以下を叩けば座標は取得できる
pyautogui.position()
# > Point(x=1220, y=449)

pag.locateOnScreen()

import pyautogui as pag
import pathlib

icon = '/Users/***/Desktop/icon.png'
icon_region = pag.locateOnScreen(icon)
print(icon_region)

# > Box(left=62, top=66, width=170, height=200)
import pyautogui as pag
import time

pag.PAUSE = 2.5
time.sleep(5)

# 画面上で指定されたpngを探し、座標が戻ってくる
icon_region = pag.locateOnScreen('chrome_icon.png')
# >> (648,479,54,62)

# ただし、centerメソッドにNone値(見つからず)を渡すとTypeErrorになるため
if icon_region is not None:
  x, y = pag.center(icon_region)
  print('x={}, y={}'.forma(x, y))
else:
  print('見つからず')

# もしずっと見つからず固まっているような場合はctrl+cで抜ける
表示されたらクリック
  • 画像があればクリックして次の処理へ(break)
  • 画像が見つからない場合は何もしない
  • 完了のポップアップなどが出たときにクリックできる
import pyautogui as pag

def wait_click(path):
  img = pag.locateOnScreen(path, confidence=0.9)
  if img is None:
    pass
  elif img is not None:
    time.sleep(5)
    pag.click(img)
    break
	else:
    pass
  
wait_click(r'C:¥***¥test.png')  

pag.locateCenterOnScreen()

# 上述のメソッドを一気にやってしまえる
# ただし、画像が複数受け取りだとNoneが返された場合エラーとなるため
# いったんTupleで受け取り、Noneチェックを実施する
icon_center = pag.locateCenterOnScreen('chrome_icon.png')

if icon_center is not None:
  x, y = icon_center
  print('x={}, y={}'.forma(x, y))
else:
  print('見つからず')

pag.locateAllOnScreen()

# 探索画像が複数ある場合はこれを使う
icon_multi = pag.locateAllOnScreen('chrome_icon.png')

for icon_region in icon_multi:
  prin(icon_region)

# >>(417,280,54,62)など複数

メッセージボックス

  • Jupyterとは相性悪い
  • ボックス表示させると固まる(?)

警告

  • pag.alert(args)
引数説明
text=”メッセージ
title=”タイトル
タイトルは改行は効かない
button=”ボタン表示の文字列
デフォルトは「OK」
¥nで改行できる
ボタンが押されるとボタン表示の文字列が返される
×を押した場合はNoneが返される
res = pag.alert(title='ここがタイトル', \
                text='この欄にテキストを入力\n改行もできるよ',\
                button='ボタンはここ')
image-20220125230334521

確認

  • pag.confirm(args)
  • 確認メッセージ用
  • デフォルト:buttons=[‘OK’, ‘Cancel’](sが付くので注意)
  • ボタンが複数つくれる(警告は1つだけ)
pag.confirm(title='ここがタイトル', text='この欄にテキストを入力\n改行もできるよ')
image-20220125231214121

テキスト入力

  • pg.prompt(args)
  • default = ” :最初から入力されているテキスト
  • buttonは「OK」「Cancel」の2種類のみ
  • 返り値
  • 「OK」:入力されたテキストが返される(空欄であれば長さ0のstr型)
  • 「Cancel」:Noneが返される(右上の×も同じ)
res=pag.prompt(text="何かテキストを入力してください",\
               title="テキスト入力",default="デフォルト")
print(res)
image-20220125231958503