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

## やりたいこと


- 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:terminal
pip install pyautogui
```


importして使います


```python:python
import pyatuogui
```


### 1-2. マウス操作


#### 1-2-1. マウス移動


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


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


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


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


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


クリックもできます


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


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


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


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


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


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


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


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


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


```python:その他クリック
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. スクロール


スクロールもできます


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


#### 1-2-5. その他


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


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


### 1-3. キーボード操作


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


## 2. PyGetWindow


### 2-1. インストール


pipで入ります


```terminal:terminal
pip install pygetwindow
```


importして使います


```python:python
import pygetwindow
```


### 2-2. Windowを取得する


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


```python:現在のアクティブウィンドウを取得
window = pygetwindow.getActiveWindow()
```


```python:すべてのウィンドウを取得
windows = pygetwindow.getAllWindows()
```


### 2-2. Windowの情報を得る


```python:ウィンドウのタイトルを取得
window.title
```


```python:ウィンドウの幅や高さを取得
window.width, window.height
```


```python:ウィンドウの位置を取得
window.top, window.left, window.box, window.center
```


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


```python:最大化する
window.maximize()
```


```python:最小化する
window.minimize()
```


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


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


### 2-5. 閉じる


```python:閉じる
window.close()
```


## まとめ


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