2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PythonでGUI操作を自動化する (PyAutoGUI, PyWinAuto)

Posted at

やりたいこと

  • WindowsのGUI操作の自動化をやりたい
  • Python環境は作ってあるのでPythonでやりたい

ツール

1つのパッケージで全部やるのは難しいようなのでPyAutoGUIとPyGetWindowを組み合わせてやりたいと思います
どちらもWindows, Mac, Linuxに対応したクロスプラットフォームのパッケージのようですが、今回はWindows11でやっていきます

PyAutoGui

キーボード操作、マウス操作、スクリーンショット取得などが出来るパッケージです
https://pyautogui.readthedocs.io/en/latest/index.html

PyGetWindow

GUIのヴィンドウ一覧の取得や最大化/最小化のほか、ウィンドウを閉じたりアクティベートしたりといった操作ができるパッケージです
https://pygetwindow.readthedocs.io/en/latest/

1.PyAutoGUI

1-1. インストール

pipで入ります

terminal
pip install pyautogui

importして使います

python
import pyatuogui

1-2. マウス操作

1-2-1. マウス移動

座標を指定してマウスポインタを移動することができます
マウスの座標を確認したり、ドラッグアンドドロップの開始点に移動したりでよく使います

画面上の左上から(100, 200)pxの位置に移動
pyautogui.moveTo(100, 200) 

ゆっくり動かすこともできます

画面上の左上から(100, 200)pxの位置に4秒かけて移動
pyautogui.moveTo(100, 200, duration=4) 

1-2-2. クリックする

クリックもできます

(100px, 200px)をクリックする
pyautogui.moveTo(100, 200) 
pyautogui.click()

座標を指定してクリックすることもできます

(100px, 200px)をクリックする
pyautogui.click(100, 200)

1-2-3. ドラッグアンドドロップする

座標を指定してドラッグアンドドロップすることもできます

(100px, 200px)から(100px, 200px)まで2秒かけてドラッグアンドドロップする
pyautogui.moveTo(100, 200) 
pyautogui.dragTo(400, 400, duration=2)

同じことを相対座標でもできます

(100px, 200px)から(100px, 200px)まで2秒かけてドラッグアンドドロップする
pyautogui.moveTo(100, 200) 
pyautogui.dragRel(300, 200, duration=2)

右クリックやダブルクリックなどもできます

その他クリック
pyautogui.rightClick(x=moveToX, y=moveToY)
pyautogui.middleClick(x=moveToX, y=moveToY)
pyautogui.doubleClick(x=moveToX, y=moveToY)
pyautogui.tripleClick(x=moveToX, y=moveToY)

1-2-4. スクロール

スクロールもできます

マウスホイールによるスクロール
pyautogui.scroll(amount_to_scroll, x=moveToX, y=moveToY)

1-2-5. その他

あまり使わないと思いますがマウスダウン、マウスアップを明示的にやることもできます
マウスダウンしてしまうとキーボード入力ができなくなったり不便なので、例外で止まるときに確実にマウスアップするようにしておいた方が良いと思います

マウスダウン、マウスアップ
pyautogui.mouseDown(x=moveToX, y=moveToY, button='left')
pyautogui.mouseUp(x=moveToX, y=moveToY, button='left')

1-3. キーボード操作

1-3-1. キーボード入力

キーボード入力もできます

キーボード入力
pyautogui.typewrite('Hello world!\n', interval=secs_between_keys)

カーソルキーやENTERキーなどは以下のようにリストにして渡してやることで入力できるようです

キー入力
pyautogui.typewrite(['a', 'b', 'c', 'left', 'backspace', 'enter', 'f1'], interval=secs_between_keys)

1-3-2. CTRLやALTを押しながらキー入力する

hotkey()に同時押ししたいキーをまとめて渡すとできるようです

キー同時押し
pyautogui.hotkey('ctrl', 'c')  # ctrl-c to copy

1-3-3. 任意のキー操作をつくる

keyDownとkeyUpも操作できます
僕の環境ではhotkeyが上手く動かなかったのでこちらでやりました

キーダウン、キーアップ
pyautogui.keyDown(key_name)
pyautogui.keyUp(key_name)

1-4. スクリーンショットを撮影

1-4-1. スクリーンショットを撮る

画面全体のスクリーンショットを撮ります
PIL.Imageオブジェクトとして取得できるのでめちゃめちゃ便利です

スクリーンショットを撮る
im = pyautogui.screenshot()

PATHを渡してやると画像を保存してくれます

スクリーンショットを保存する
im = pyautogui.screenshot('hoge.png')

1-4-2. 画面から画像と一致する表示を探す

UI上のボタンなどのデザインが決まってるものを画面内から探して場所を取得することができます
ただ、明度変化があったりすると見つからなくなったりするのでOpenCVのパターンマッチなどを使った方がロバストに作れると思います

指定した画像が画面内に
box = pyautogui.locateOnScreen('fuga.png')
center = pyautogui.center(box)
pyautogui.click(center)

2. PyGetWindow

2-1. インストール

pipで入ります

terminal
pip install pygetwindow

importして使います

python
import pygetwindow

2-2. Windowを取得する

現在アクティブなウィンドウを取得して後で戻ってこれるようにできます

現在のアクティブウィンドウを取得
window = pygetwindow.getActiveWindow()
すべてのウィンドウを取得
windows = pygetwindow.getAllWindows()

2-2. Windowの情報を得る

ウィンドウのタイトルを取得
window.title
ウィンドウの幅や高さを取得
window.width, window.height
ウィンドウの位置を取得
window.top, window.left, window.box, window.center

2-3. Windowを最大化/最小化

最大化する
window.maximize()
最小化する
window.minimize()

2-4. アクティベートする

アクティベート
window.activate()

2-5. 閉じる

閉じる
window.close()

まとめ

何故1つのパッケージにまとまってないのか不思議ではありますが、PyAutoGUIとPyWinAutoを組み合わせればGUI操作はだいたいなんでも出来ると思います。Pythonでやる場合、取得したデータをPandasで加工するのもやりやすいですし、高度なことをやろうと思ったらOpenCVを組み合わせたりできますので、下手なRPAを使うよりも強力なツールとなり得るかもしれません

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?