目次
基本
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_KEYSKEYBOAD_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)
# 引き数にファイル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='ボタンはここ')
確認
pag.confirm(args)- 確認メッセージ用
- デフォルト:buttons=[‘OK’, ‘Cancel’](sが付くので注意)
- ボタンが複数つくれる(警告は1つだけ)
pag.confirm(title='ここがタイトル', text='この欄にテキストを入力\n改行もできるよ')
テキスト入力
pg.prompt(args)- default = ” :最初から入力されているテキスト
- buttonは「OK」「Cancel」の2種類のみ
- 返り値
- 「OK」:入力されたテキストが返される(空欄であれば長さ0のstr型)
- 「Cancel」:Noneが返される(右上の×も同じ)
res=pag.prompt(text="何かテキストを入力してください",\
title="テキスト入力",default="デフォルト")
print(res)