Pythonから日常のパソコン操作を自動化できたら便利だと思ったことはありませんか。
PyAutoGUIは、マウス移動やクリック、キーボード入力、スクリーンショット取得、画像認識によるボタン検出まで、GUI操作を幅広くカバーします。
本記事でははじめての方向けに、安全に始めるための準備から基本操作、画像認識、自動化レシピまで丁寧に解説します。
PyAutoGUIの基本
PyAutoGUIとは
PyAutoGUIは、Pythonからマウスやキーボードを操作できるライブラリです。
moveTo
でマウスを移動し、click
でクリック、write
で文字入力、screenshot
でスクリーンショット取得、locateOnScreen
で画像を検索するなど、人の操作をプログラムで再現できます。
Webブラウザやデスクトップアプリの定型操作を自動化したい場面で力を発揮します。
以下は代表的な機能の一覧です。
機能 | 代表的な関数 | 説明 |
---|---|---|
画面サイズ取得 | size | 画面の幅と高さを取得します |
現在座標取得 | position | マウスカーソルの現在位置を取得します |
マウス移動 | moveTo , moveRel | 絶対座標や相対座標へ移動します |
クリック | click , doubleClick | 左右クリックやダブルクリックを行います |
ドラッグ | dragTo , dragRel | 指定位置までドラッグします |
スクロール | scroll | 上下スクロールを行います |
キー入力 | write , press , hotkey | 文字入力やショートカットを送信します |
画像検索 | locateOnScreen , locateCenterOnScreen | 画面上で画像を探します |
スクリーンショット | screenshot | 画面全体や一部を画像として取得します |
初心者の安全対策
GUI自動化は失敗すると手動操作がやりにくくなることがあります。
以下の準備をしてください。
- 緊急停止:
pyautogui.FAILSAFE = True
(初期値True)のとき、画面左上(0,0)にマウスを素早く移動すると即時停止します。 - 一時停止:
pyautogui.PAUSE = 0.5
などを設定すると、各アクションの後に自動で待機が入ります。 - 小さく、ゆっくり試す: 最初は短いスクリプト、低速(長めの
duration
やsleep
)でテストしましょう。 - 確認ダイアログ:
pyautogui.confirm
やpyautogui.alert
で開始前の確認を入れると安全です。
対応OSと権限設定
PyAutoGUIはWindows、macOS、Linuxで動作しますが、OSごとに権限が必要な場合があります。
OS | 追加権限や準備 | メモ |
---|---|---|
Windows | 管理者権限が必要なアプリを操作する場合は、Pythonも管理者として実行 | ディスプレイの拡大縮小(125%など)は座標や画像検索に影響します |
macOS | システム設定→プライバシーとセキュリティ→アクセシビリティ/画面収録にTerminalやPythonを追加 | 初回実行時に許可ダイアログが出ることがあります |
Linux | X11環境が安定。必要に応じてpython3-xlib やscrot の導入 | Waylandでは制約が強く、Xorgに切替えると安定します |
画像認識でconfidence
を使う場合はOpenCVが必要(pip install opencv-python
)です。
画面座標と解像度の基礎
PyAutoGUIの座標は(0, 0)
が左上、(width-1, height-1)
が右下です。
解像度はpyautogui.size()
で取得できます。
複数モニタでは、左側にモニタがあると負のX座標が発生します。
相対座標(現在位置からの移動)と絶対座標(画面上の位置指定)の違いを意識しましょう。
導入と基本操作
インストール方法
PyPIからインストールします。
画像認識の精度調整(confidence
)を使う場合はOpenCVも入れます。
# 基本
pip install pyautogui
# 画像認識でconfidenceを使うなら
pip install opencv-python
# (Linuxで必要になることがある追加パッケージの例)
# Debian/Ubuntu:
# sudo apt-get install -y python3-xlib scrot
動作確認スニペット
# 動作確認: 画面サイズと現在のマウス座標を表示
import pyautogui
print("Screen size:", pyautogui.size())
print("Current position:", pyautogui.position())
Screen size: Size(width=1920, height=1080)
Current position: Point(x=842, y=516)
画面サイズを取得
# 画面の幅と高さを取得して表示します
import pyautogui
w, h = pyautogui.size()
print(f"Width: {w}, Height: {h}")
メインディスプレイの解像度が取得されます。セカンドディスプレイの状態は考慮されません。
Width: 1920, Height: 1080
マウス移動とクリック
# マウスをゆっくり移動してクリックします
import time
import pyautogui
pyautogui.FAILSAFE = True # 左上で緊急停止
pyautogui.PAUSE = 0.3 # 各操作の後に0.3秒待機
# 例: 画面中央へ移動してクリック
screen_w, screen_h = pyautogui.size()
center_x, center_y = screen_w // 2, screen_h // 2
print("3秒後にマウスを中央に移動してクリックします。準備してください。")
time.sleep(3)
pyautogui.moveTo(center_x, center_y, duration=1.5) # 1.5秒かけて中央へ
pyautogui.click() # 左クリック
print("完了")
3秒後にマウスを中央に移動してクリックします。準備してください。
完了
ドラッグとスクロール
# 簡単なドラッグとスクロールの例
import time
import pyautogui
pyautogui.PAUSE = 0.2
# ドラッグ: 現在位置から右に200px、下に100pxドラッグ
print("2秒後にドラッグします。")
time.sleep(2)
pyautogui.dragRel(200, 100, duration=1.0, button="left") # 相対ドラッグ
# スクロール: 上方向に500単位スクロール
# もし逆方向になる場合は値の符号を逆にしてください
pyautogui.scroll(500)
print("ドラッグとスクロールのデモ完了")
2秒後にドラッグします。
ドラッグとスクロールのデモ完了
キーボード入力
# キー入力: 文字列入力とショートカット送信
import platform
import pyautogui
import time
pyautogui.PAUSE = 0.2
# 1) テキスト入力
time.sleep(1)
pyautogui.write("Hello, PyAutoGUI!", interval=0.05) # 1文字ごとに0.05秒待つ
pyautogui.press("enter")
# 2) CtrlまたはCommandとのショートカット
is_mac = platform.system() == "Darwin"
modifier = "command" if is_mac else "ctrl"
pyautogui.hotkey(modifier, "a") # 全選択
pyautogui.hotkey(modifier, "c") # コピー
print("入力とショートカット送信が完了しました")
入力とショートカット送信が完了しました
待機の入れ方
待機には次の方法があります。
用途に応じて併用します。
待機は自動化の安定性向上に直結します。
time.sleep(sec)
: 明示的に待つ(おすすめの基本)。pyautogui.PAUSE = 秒
: 全操作の後に休止を自動挿入。- 画像待ち:
locateOnScreen
で対象が見えるまでループ。
# 画像が出るまで最大10秒待つ関数の例
import time
import pyautogui
def wait_for_image(path, timeout=10, confidence=0.9):
start = time.time()
while time.time() - start < timeout:
pos = pyautogui.locateCenterOnScreen(path, confidence=confidence)
if pos:
return pos
time.sleep(0.3)
return None
print("ボタン画像を待機中...")
p = wait_for_image("button.png", timeout=10)
print("見つかった座標:", p)
ボタン画像を待機中...
見つかった座標: None
相対移動と絶対座標の違い
# 相対移動(moveRel)と絶対座標(moveTo)の違いを体感します
import time
import pyautogui
print("絶対座標へ移動→クリック")
pyautogui.moveTo(100, 100, duration=1.0)
pyautogui.click()
print("相対座標へ移動→クリック(今の位置から右へ50, 下へ20)")
pyautogui.moveRel(50, 20, duration=0.5)
pyautogui.click()
print("完了")
絶対座標へ移動→クリック
相対座標へ移動→クリック(今の位置から右へ50, 下へ20)
完了
画像認識で操作する
スクリーンショットの保存
# 画面全体と一部領域のスクリーンショットを保存します
import pyautogui
# 全体
img = pyautogui.screenshot()
img.save("full.png") # カレントディレクトリに保存
# 領域(x, y, width, height)を指定して保存
region_img = pyautogui.screenshot(region=(100, 100, 300, 200))
region_img.save("region.png")
print("スクリーンショットを保存しました")
スクリーンショットを保存しました
画像から位置を探す
# 画像(button.png)が画面上にある位置を探してクリックします
# 事前に探したいボタンのスクリーンショットを"button.png"として用意してください
import pyautogui
import time
pyautogui.PAUSE = 0.3
print("2秒後に検索開始")
time.sleep(2)
pos = pyautogui.locateCenterOnScreen("button.png") # OpenCVなしでは完全一致
if pos:
print("見つかりました:", pos)
pyautogui.moveTo(pos.x, pos.y, duration=0.8)
pyautogui.click()
else:
print("画像が見つかりませんでした")
2秒後に検索開始
画像が見つかりませんでした
精度の調整(confidence)の基本
confidence
を使うにはOpenCVが必要です(pip install opencv-python
)。
値は0.0〜1.0で、1.0に近いほど厳密です。
実務では0.8〜0.95程度が使われます。
# OpenCV導入済みであれば、類似度マッチングが可能
import pyautogui
pos = pyautogui.locateCenterOnScreen("button.png", confidence=0.88)
print("検出結果:", pos)
検出結果: None
見つからない時の対処
画像が見つからないときは、以下を見直します。
PyAutoGUIの画像検索はスクリーンショットと実画面の見た目が同じであることが前提です。
- 解像度やスケーリング: Windowsの表示スケールを100%にすると安定します。
- 画像の切り出し: 余白を減らし、特徴がはっきりする最小範囲で保存します。
confidence
の調整とgrayscale=True
の併用で一致範囲を緩める。- 検索範囲を
region=(x, y, w, h)
で絞って高速化と誤検出低減。 - ダークモード/ライトモードの違い、テーマやフォント差異を合わせる。
小さな自動化レシピとコツ
メモ帳にテキスト入力を自動化
操作対象アプリを起動してから、フォーカス位置に文字を入力します。
OSごとに代表的なエディタを起動します。
# メモ帳(TextEdit, gedit)を起動して文字を入力する例
import platform
import subprocess
import time
import pyautogui
pyautogui.FAILSAFE = True
pyautogui.PAUSE = 0.2
system = platform.system()
print("エディタを起動します...")
if system == "Windows":
# Windowsのメモ帳
subprocess.Popen(["notepad"])
elif system == "Darwin":
# macOSのTextEdit
subprocess.Popen(["open", "-a", "TextEdit"])
else:
# Linux: geditがない場合はインストールや別エディタを利用してください
subprocess.Popen(["gedit"])
time.sleep(1.5) # 起動待ち(環境に応じて調整)
# 文字入力
pyautogui.write("これはPyAutoGUIの入力テストです。", interval=0.05)
pyautogui.press("enter")
pyautogui.write("複数行の入力も可能です。", interval=0.05)
# 保存ショートカット
modifier = "command" if system == "Darwin" else "ctrl"
pyautogui.hotkey(modifier, "s")
time.sleep(0.5)
pyautogui.write("pyautogui_demo.txt")
pyautogui.press("enter")
print("入力と保存を実行しました")
エディタを起動します...
入力と保存を実行しました
ボタンを探してクリックする
画像認識を使って、ボタン画像をクリックします。
時間制限とリトライを入れて頑健にします。
# 画像(button.png)を探してクリック。見つからない場合はタイムアウトで終了
import time
import pyautogui
def click_image(path, timeout=8, confidence=0.9):
start = time.time()
while time.time() - start < timeout:
pos = pyautogui.locateCenterOnScreen(path, confidence=confidence)
if pos:
pyautogui.moveTo(pos.x, pos.y, duration=0.4)
pyautogui.click()
return True
time.sleep(0.3)
return False
print("ボタン探索を開始します")
ok = click_image("button.png", timeout=8, confidence=0.88)
print("クリック成功:", ok)
ボタン探索を開始します
クリック成功: False
失敗しにくい書き方
PyAutoGUIは環境差の影響を受けやすいため、明示的な待機、再試行、範囲指定、ログ出力を入れると安定します。
以下は安全なクリック関数の例です。
# 失敗しにくい安全クリックのヘルパー
import time
import pyautogui
def safe_click(target=None, x=None, y=None, retries=3, delay=0.4):
"""
target: 画像パス(画像クリック)
x, y : 座標指定(座標クリック)
どちらか一方を指定します
"""
assert (target is None) != (x is None or y is None), "targetまたはx,yのどちらかを指定"
for attempt in range(1, retries + 1):
try:
if target:
pos = pyautogui.locateCenterOnScreen(target, confidence=0.9)
if not pos:
print(f"[{attempt}/{retries}] 画像が見つかりません。リトライします")
time.sleep(delay)
continue
x, y = pos.x, pos.y
pyautogui.moveTo(x, y, duration=0.3)
pyautogui.click()
print("クリック成功:", x, y)
return True
except pyautogui.FailSafeException:
print("FailSafeで停止しました")
raise
except Exception as e:
print(f"[{attempt}/{retries}] 例外が発生: {e}")
time.sleep(delay)
print("クリック失敗: リトライ回数を超えました")
return False
# 使用例
# safe_click(target="ok_button.png")
# safe_click(x=200, y=300)
[1/3] 画像が見つかりません。リトライします
[2/3] 画像が見つかりません。リトライします
[3/3] 画像が見つかりません。リトライします
クリック失敗: リトライ回数を超えました
緊急停止の使い方
緊急停止は必ず覚えておきましょう。
左上へのマウス移動で止まるFAILSAFE
の他、明示的に中断を促す方法もあります。
# 緊急停止の基本と安全な動作速度
import pyautogui
import time
# 1) 左上でFailSafe例外を投げる(デフォルトTrue)
pyautogui.FAILSAFE = True
# 2) すべての操作の後に0.5秒休止
pyautogui.PAUSE = 0.5
# 3) 実行前の確認(OKで続行/Cancelで中止)
resp = pyautogui.confirm(text="自動化を開始します。準備はよろしいですか", title="PyAutoGUI", buttons=["OK", "Cancel"])
if resp != "OK":
print("キャンセルされました")
else:
print("5秒後に開始します。左上に移動で緊急停止できます")
time.sleep(5)
pyautogui.moveTo(200, 200, duration=2.0)
pyautogui.click()
print("完了")
5秒後に開始します。左上に移動で緊急停止できます
完了
まとめ
本記事では、PyAutoGUIの基礎から導入、マウス・キーボード操作、待機の入れ方、画像認識、実用的なレシピまでを解説しました。
GUI自動化の安定性は待機、再試行、権限設定、解像度やスケーリングの整合に大きく依存します。
最初は小さく始め、FAILSAFE
とPAUSE
で安全を確保しながら、画像の精度調整(confidence)や検索範囲(region)で堅牢性を高めていきましょう。
PyAutoGUIはSeleniumなどと異なり、アプリやOSの見た目に依存しますが、その分あらゆるGUIに適用できる柔軟性があります。
自分の環境に合わせた工夫を重ねて、日々の定型作業を着実に自動化していきましょう。