PyAutoGUIとは、キーボードやマウスのGUI操作を自動化できるPythonのライブラリです。
このライブラリを使うことで、PythonでRPAを実現することが可能になります。
この記事を読むことで、PyAutoGUIで出来る事と基本的な使い方について理解できます。
PyAutoGUIで出来ること
PyAutoGUIでは以下の操作を自動化することができます。
・マウスを動かして、アプリケーションのボタンなどをクリックする
・フォームにキーストロークを送信する(フォームに記入する)
・スクリーンショットを撮り、ボタンやチェックボックスを見つける
・アプリケーションウィンドウの移動、サイズ変更、最大化、最小化、閉じる(現在はWindowsのみ)
・アラート、メッセージボックスを表示する
動作サンプルがYoutubeにありますので参考にしてみてください。PyAutoGUIサンプル動画
サンプルでは、ゲームのウィンドウを監視し、寿司注文の画像を検索、注文があったら材料ボタンをクリックして寿司を作っています。また、材料が無くなってきたら電話で材料を注文しています。
2023年8月時点での未対応内容は以下となります。
・マルチモニターでは動作不可(プライマリーモニターでのみ動作可)
・キーロギングやキーの押下を検知することは不可
・OCRは実行不可(今後搭載の可能性有り)
ライブラリ
インストール :必要
ライブラリのインストール
pip
コマンドでpyautogui
ライブラリをインストールします。
・関連記事:Pythonライブラリのインストール(pipの使い方)
1 | python -m pip install pyautogui |
PyTweening、PyScreeze、PyGetWindow、PymsgBox、MouseInfoなど、依存するモジュールが同時にインストールされます。
ライブラリのインポート
pyautoguiライブラリをインポートします。
1 | import pyautogui |
基本機能
位置はX-Y座標、ピクセルで表現します。
原点(0, 0)は画面の左上端で、横方向がXで右に行くと増加、縦方向がYで下に行くと増加します。
画面サイズ取得
モニターのサイズを取得します。
1 2 3 | pyautogui.size() # Size(width=1920, height=1080) |
マウス現在位置取得
マウスの現在位置を取得します。
1 2 3 | pyautogui.position() # Point(x=779, y=378) |
プログラムの一時停止
スクリプトを一定時間停止します。
アプリケーションの起動待ちの時などに利用します。
1 | p.sleep(10) |
マウス操作
カーソル移動、クリック、ドラッグ動作を行うことができます。
カーソル移動
カーソルを、移動先座標を指定もしくは相対座標を指定して移動する事ができます。
または
pyautogui.moveRel(X移動量, Y移動量, duration=移動にかかる秒数)
moveTo()
の引数にXY座標を指定すると、一瞬でカーソルが移動します。
1 | pyautogui.moveTo(500, 600) |
引数duration=秒数
を指定することで、マウスを動かす速度を変更することができます。
1 | pyautogui.moveTo(100, 300, duration=2) |
move()
またはmoveRel()
を使用して、現在位置からの相対位置を指定することもできます。
移動量は負の値(ー)を指定することができます。
1 | pyautogui.move(200, -100, duration=1) |
クリック
マウスの左、中、右ボタンクリックを行えます。クリック回数とクリック間隔の指定も可能です。
引数x, y を指定すると、指定座標に移動してからクリック動作を実行します。
1 | pyautogui.click(x=500, y=500, clicks=2, interval=0.25, button='left') |
button
は'left'
, 'middle'
, 'right'
が指定できます。左クリックの場合はbutton
は省略可能です。
カーソル移動にかかる時間duration
も引数で指定することもできます。
x
, y
を省略すると現在位置でクリック動作を実行します。
1 | pyautogui.click(clicks=1, button='right') |
全てのクリック動作をclick()
で指定できますが、可読性を上げるために以下のメソッドも提供されています。
1 2 3 4 | pyautogui.rightClick() #右クリック pyautogui.middleClick() #中クリック pyautogui.doubleClick() #ダブルクリック pyautogui.tripleClick() #トリプルクリック |
クリックダウンとクリックアップの個々のイベントは、mouseDown()
, mouseUp()
で個別に呼び出すことができます。
1 2 | pyautogui.mouseDown(button='left') pyautogui.mouseUp(button='left') |
スクロール
アクティブ画面をスクロールします。
1 2 | pyautogui.scroll(500) pyautogui.scroll(-300) |
ドラッグ
ドラッグ(マウスをクリックしたまま移動)します。
1 2 | pyautogui.drag(50, 100, duration=1, button="right") pyautogui.drag(-50, 100, duration=1, button="right") |
キーボード操作
キーボード入力を行うことができます。
文字入力
指定した文字列を入力します。
50文字程度だと0.1秒程度で入力が完了します。
入力時間を制御する場合はinterval
で入力間隔を指定します。
1 | pyautogui.write('Hello world!', interval=0.25) |
特殊キー入力
Enter、Alt、F(ファンクション)キーなど特殊キーを入力するにはpress()
を使用します。
特殊キーはリンク先の一覧を参照してください。
特殊キーリスト
1 2 | pyautogui.press("enter") pyautogui.press("f1") |
同時入力
複数のキーを同時に入力する方法は2つあります。keyDown()
, keyUp()
を使う方法と、hotkey()
を使用する方法です。
pyautogui.keyUp()
1 2 3 4 | pyautogui.keyDown('shift') pyautogui.press('a') pyautogui.keyUp('shift') pyautogui.press('a') |
1文字目のaはshiftキーが押された状態となり大文字の「A」が入力され、2文字目はshiftが解除され小文字の「a」が入力されます。
1 2 | pyautogui.hotkey('shift', 'a', 'b', 'c') pyautogui.hotkey('ctrl', 'a') |
keyDown()
, keyUp()
だとキーの数が増えると行数が増えてしまいますが、hotkey()
であれば1行で書くことができます。
ただし ctrl+ alt + delete は機能しないようになっています。
日本語入力
PyAutoGUIのキーボード制御は、日本語入力には対応していません。
日本語を入力する場合は、クリップボード機能を利用して日本語のコピー、貼り付けで実現します。
1 2 3 4 5 6 7 8 | import pyautogui import pyperclip # 日本語文字列をクリップボードにコピー pyperclip.copy('日本語入力') # キーボード操作で貼り付け pyautogui.hotkey('ctrl','v') |
クリップボードの内容が更新されてしまうため、注意してください。
スクリーンショット
スクリーンショットを取得できます。
スクリーンショットを取得
1 2 | im1 = pyautogui.screenshot() im2 = pyautogui.screenshot('screenshot.png') |
画面全体ではなく指定した範囲のスクリーンショットを取得する場合は、引数region=(始点X, 始点Y, 終点X, 終点Y)
で範囲を指定します。
1 | im = pyautogui.screenshot(region=(0,0, 300, 400)) |
指定した画像を画面から見つける
指定した画像と同じ画像が表示画面上に存在するか検索して、見つかった場合に座標値を返します。
これとマウスクリックなどを組み合わせる事で、アプリケーション操作を自動化する事ができます。
サンプルとして、電卓アプリのボタンを検索してみます。
ボタン「1」の画像を「key_1.jpg」として保存しておき、電卓アプリ上の位置を検索します。
1 2 3 4 | key_1 = pyautogui.locateOnScreen('key_1.jpg') print(key_1) # Box(left=213, top=692, width=103, height=64) |
戻り値は検索位置の左上端の座標値と幅・高さのタプルになります。
このタプルからcenter()
で中心座標を取得できます。
1 2 3 4 | x, y = pyautogui.center(key_1) print(x ,y) # 264 724 |
もしくはlocateCenterOnScreen()
を使うことで1行で中心座標を取得することができます。
1 | pyautogui.locateCenterOnScreen('key_1.jpg') |
認識精度調整
locateOnScreen
のデフォルト設定ではマッチング判定のしきい値が高く、画像が検出されない事が多くあります。そこで検索精度の設定値confidence
を指定することで、検索しやすくする事ができます。
ただしconfidence
を指定するにはOpecCVが必要になるので、pip
でインストールします。
1 | python -m python -m pip install opencv-python |
1 | key_1x, key_1y = pyautogui.locateCenterOnScreen('key_1.jpg', confidence=0.9) |
ただしconfidence
の値を小さくしすぎると誤判定の可能性が高くなるため、注意が必要です。
サンプルプログラム
電卓の計算を自動化するサンプルプログラムです。
ボタン画像をスクリプトと同じディレクトリに保存して、電卓の画面全体が見える状態で実行してみてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import pyautogui key_1x, key_1y = pyautogui.locateCenterOnScreen('key_1.jpg', confidence=0.9) key_2x, key_2y = pyautogui.locateCenterOnScreen('key_2.jpg', confidence=0.9) key_3x, key_3y = pyautogui.locateCenterOnScreen('key_3.jpg', confidence=0.9) key_plusx, key_plusy = pyautogui.locateCenterOnScreen('key_plus.jpg', confidence=0.9) key_equalx, key_equaly = pyautogui.locateCenterOnScreen('key_equal.jpg', confidence=0.9) pyautogui.click(key_1x, key_1y, interval=0.5) pyautogui.click(key_2x, key_2y, interval=0.5) pyautogui.click(key_3x, key_3y, interval=0.5) pyautogui.click(key_plusx, key_plusy, interval=0.5) pyautogui.click(key_3x, key_3y, interval=0.5) pyautogui.click(key_2x, key_2y, interval=0.5) pyautogui.click(key_1x, key_1y, interval=0.5) pyautogui.click(key_equalx, key_equaly, interval=0.5) |
フェールセーフ機能
実行中のプログラムを停止させたい場合でも、マウスやキーボードをPythonから制御しているせいで、スクリプトを停止できない状態になってしまうこともあります。
そんな時のために、PyAutoGUIではFAILSAFE機能が搭載されています。
マウスをフェールセーフポイントである、パソコン画面の左上端・左下端・右上端・右下端に持っていくだけで、スクリプトを停止させることができます。
PyAutoGUIでは、スクリプトからマウス・キーボード操作を実行する際に、毎回 0.1 秒のsleepが入る事になっています。この0.1秒の間にマウスを手動でフェールセーフポイントまで動かせば、スクリプトが中断します。
sleep時間はpyautogui.PAUSE
で設定可能です。
以上でPyAutoGUIの解説は終了です。
ぜひ活用していただき業務の効率化を進めてください。
作成したスクリプトはexe化して配布したり、自動実行させることが可能です。
詳細は以下の記事を参照してください。
・関連記事:【Python】PyInstallerでPythonスクリプトをexe化
・関連記事:【Win11】Pythonスクリプトを自動実行する方法