閉じる

はじめてのPyAutoGUI: PythonでGUI操作を自動化する方法を解説

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などを設定すると、各アクションの後に自動で待機が入ります。
  • 小さく、ゆっくり試す: 最初は短いスクリプト、低速(長めのdurationsleep)でテストしましょう。
  • 確認ダイアログ: pyautogui.confirmpyautogui.alertで開始前の確認を入れると安全です。

対応OSと権限設定

PyAutoGUIはWindows、macOS、Linuxで動作しますが、OSごとに権限が必要な場合があります。

OS追加権限や準備メモ
Windows管理者権限が必要なアプリを操作する場合は、Pythonも管理者として実行ディスプレイの拡大縮小(125%など)は座標や画像検索に影響します
macOSシステム設定→プライバシーとセキュリティ→アクセシビリティ/画面収録にTerminalやPythonを追加初回実行時に許可ダイアログが出ることがあります
LinuxX11環境が安定。必要に応じてpython3-xlibscrotの導入Waylandでは制約が強く、Xorgに切替えると安定します

画像認識でconfidenceを使う場合はOpenCVが必要(pip install opencv-python)です。

画面座標と解像度の基礎

PyAutoGUIの座標は(0, 0)が左上、(width-1, height-1)が右下です。

解像度はpyautogui.size()で取得できます。

複数モニタでは、左側にモニタがあると負のX座標が発生します。

相対座標(現在位置からの移動)と絶対座標(画面上の位置指定)の違いを意識しましょう。

導入と基本操作

インストール方法

PyPIからインストールします。

画像認識の精度調整(confidence)を使う場合はOpenCVも入れます。

Shell
# 基本
pip install pyautogui

# 画像認識でconfidenceを使うなら
pip install opencv-python

# (Linuxで必要になることがある追加パッケージの例)
# Debian/Ubuntu:
# sudo apt-get install -y python3-xlib scrot

動作確認スニペット

Python
# 動作確認: 画面サイズと現在のマウス座標を表示
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)

画面サイズを取得

Python
# 画面の幅と高さを取得して表示します
import pyautogui

w, h = pyautogui.size()
print(f"Width: {w}, Height: {h}")

メインディスプレイの解像度が取得されます。セカンドディスプレイの状態は考慮されません。

実行結果
Width: 1920, Height: 1080

マウス移動とクリック

Python
# マウスをゆっくり移動してクリックします
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秒後にマウスを中央に移動してクリックします。準備してください。
完了

ドラッグとスクロール

Python
# 簡単なドラッグとスクロールの例
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秒後にドラッグします。
ドラッグとスクロールのデモ完了

キーボード入力

Python
# キー入力: 文字列入力とショートカット送信
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で対象が見えるまでループ。
Python
# 画像が出るまで最大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

相対移動と絶対座標の違い

Python
# 相対移動(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)
完了

画像認識で操作する

スクリーンショットの保存

Python
# 画面全体と一部領域のスクリーンショットを保存します
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("スクリーンショットを保存しました")
実行結果
スクリーンショットを保存しました

画像から位置を探す

Python
# 画像(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程度が使われます。

Python
# 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ごとに代表的なエディタを起動します。

Python
# メモ帳(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("入力と保存を実行しました")
実行結果
エディタを起動します...
入力と保存を実行しました

ボタンを探してクリックする

画像認識を使って、ボタン画像をクリックします。

時間制限とリトライを入れて頑健にします。

Python
# 画像(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は環境差の影響を受けやすいため、明示的な待機、再試行、範囲指定、ログ出力を入れると安定します。

以下は安全なクリック関数の例です。

Python
# 失敗しにくい安全クリックのヘルパー
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の他、明示的に中断を促す方法もあります。

Python
# 緊急停止の基本と安全な動作速度
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自動化の安定性は待機、再試行、権限設定、解像度やスケーリングの整合に大きく依存します。

最初は小さく始め、FAILSAFEPAUSEで安全を確保しながら、画像の精度調整(confidence)検索範囲(region)で堅牢性を高めていきましょう。

PyAutoGUIはSeleniumなどと異なり、アプリやOSの見た目に依存しますが、その分あらゆるGUIに適用できる柔軟性があります。

自分の環境に合わせた工夫を重ねて、日々の定型作業を着実に自動化していきましょう。

この記事を書いた人
エーテリア編集部
エーテリア編集部

人気のPythonを初めて学ぶ方向けに、文法の基本から小さな自動化まで、実際に手を動かして理解できる記事を書いています。

クラウドSSLサイトシールは安心の証です。

URLをコピーしました!