【自動化】PyAutoGUIでノータッチお絵描きしてみた

# PyAutoGUIとは
PyAutoGUIは画面上でのマウス操作を自動化することのできるライブラリです。
非常にシンプルに記述することができるので様々な使い方ができそうです。


# PyAutoGUIのインストール
PyAutoGUIを使用するにはpipでインストールする必要があります。
```py:PyAutoGUIのインストール
pip install pyautogui
```
インストール出来たらインポートします。今回は`pgui`で呼び出せるようにしました。
```py:PyAutoGUIのインポート
import pyautogui as pgui
```
# 基本操作
## マウス操作
### クリック
マウスの左クリックは`pyautogui.click()`で行います。

|関数|説明|
|---|---|
|pyautogui.click()|**現在のマウスカーソル位置**をクリック|
|pyautogui.click(x, y)|**モニター上の座標(x, y)の位置**をクリック|
|pyautogui.click('gazou.png')|**クリックしたいボタンの画像**を指定してそこをクリック|

#### pyautogui.click(x, y)
モニター上の座標(x, y)の位置をクリックします。
この座標(x,y)とは何かというと、例えば、あなたのモニターの解像度が1920 x 1080なら左上が(0,0)、右下が(1919, 1079) です。

```:カーソルの座標
0,0       X increases -->
+---------------------------+
|                           | Y increases
|                           |     |
|   1920 x 1080 screen      |     |
|                           |     V
|                           |
|                           |
+---------------------------+ 1919, 1079

(PyAutoGui公式ドキュメントから転載 <https://pyautogui.readthedocs.io/en/latest/mouse.html>)
```

#### pyautogui.click('gazou.png')
クリックしたいボタンの画像('gazou.png')を指定することで任意の位置をクリックできるようになります。
今回はWindowsの「ペイント」で緑をクリックしたいとします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2242763/82529c41-21d1-3f0f-e4c6-543bb771345e.png)


この場合、緑の部分を画像として切り出しておきます('green.png')。

![green.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2242763/503fd7a3-7bcc-bd47-98d6-d62d86be5dfa.png)


```python:任意の位置をクリック
# 緑の部分をクリック
pyautogui.click('green.png')
```

この方法は便利ですが、場合によっては画像の場所を認識できないこともあるので注意が必要です。


### 様々なクリック方法
| クリックの種類| 関数 |
|:-:|:-:|
|  左クリック | pyautogui.click()  |
|  右クリック | pyautogui.rightClick()  |
|  ダブルクリック |  pyautogui.doubleClick() |
|  ホイールクリック | pyautogui.middleClick()  |

上記の関数に従えば左クリック以外も行うことができます。

### マウスカーソルの移動
マウスカーソルの移動は絶対位置と相対位置の2種類があります。

|関数|説明|
|---|---|
|pyautogui.moveTo(x,y)|モニター上の座標(x,y)を指定して、そこに移動|
|pyautogui.move(x,y)|現在位置から横にx,縦にyだけ移動する|

#### pyautogui.moveTo(x,y)
モニター上の座標(x,y)を指定して、そこに移動します。現在位置がどこかは関係ありません。

`moveTo()`の第3引数として**移動にかける時間**を指定することもできます。
時間指定がないと一瞬で移動しますが、この時間指定によりゆっくり移動させることができます。

```python:カーソル移動（絶対位置）
# (100,100)の位置に移動
pyautogui.moveTo(100,100)

# (100,100)の位置に2秒かけて移動
pyautogui.moveTo(100,100,2)
```

#### pyautogui.move(x,y)
現在のマウスカーソルの位置から横にx,縦にyだけ移動します。
`move()`も移動にかける時間を指定できます。

```python:カーソル移動（相対位置）
# 現在位置から(100,100)だけ移動
pyautogui.move(100,100)

# 現在位置から(100,100)だけ2秒かけて移動
pyautogui.move(100,100,2)
```

### ドラッグ
ドラッグも移動先の絶対位置か相対位置かの違いで2種類あります。
ドラッグも第3引数に**ドラッグにかける時間**を指定することができます。

|関数|説明|
|---|---|
|pyautogui.dragTo(x,y)|現在位置からモニター上の座標(x,y)までドラッグ|
|pyautogui.drag(x,y)|現在位置から横にx,縦にyだけドラッグ|

```python:マウスのドラッグ
# 現在位置から(100,100)の位置まで5秒かけてドラッグ
pyautogui.dragTo(100,100,5)
```

## キーボード操作
### 文字入力（英語）
キーボードから文字入力するには`pyautogui.write()`を使います。

実際には、一度文字入力したいテキストボックスなどをクリックして、
文字カーソルをアクティブにしてから`pyautogui.write()`を実行することになると思います。
```py:文字の入力
pyautogui.write('Hello world!')
```

### 文字入力（日本語）
日本語入力する場合は、一度入力したい文字列をクリップボードにコピーして貼り付けてから行います。

クリップボードを操作するには**pyperclip**を使います。
pyperclipの詳しい使い方は下記を参照しました。

https://qiita.com/konitech913/items/83975332e395a387eace

```python:pyperclipによる文字入力
import pyperclip

# 入力した文字列をクリップボードにコピー
pyperclip.copy('こんにちは、世界！')

# Ctrl+vで貼り付け
pyautogui.hotkey('ctrl', 'v')
```

### キー入力
文字を入力するのではなく、単にキーを押したい場合は`pyautogui.press()`を使います。

```python:キー入力
#「Enterキー」を押す
pyautogui.press('enter')

#「左カーソルキー」を4回押す
pyautogui.press(['left', 'left', 'left', 'left'])
```

「Ctrl+C(貼り付け)」や「Ctrl+Z(元に戻す)」などの**ホットキー**については`pyautogui.hotkey()`で指定します。

```python:ショートカットキーの入力
# 「Ctrl+C(コピー)」
pyautogui.hotkey('ctrl', 'c')

# 「Ctrl+Z(元に戻す)」
pyautogui.hotkey('ctrl', 'z')
```

# 作成したプログラム
では最後にここまでの知識を使って、Windowsのペイントでお絵かきをしてみましょう。
今回は繰り返しで渦巻きを描いた後コメントを入れてみます。
```python:peint.py
import pyautogui as pgui
import pyperclip as pyclip

pgui.moveTo(400,300,duration=2)
pgui.click(400,300)
## 新規ページに更新
pgui.hotkey("ctrl","n")
pgui.press("n")

mt=0.1
distance=400

pgui.click("green.png")
pgui.moveTo(300,300,duration=0.5)

# 渦巻きの描画
while distance>0:
    pgui.dragRel(distance,0,duration=mt)
    distance-=20
    pgui.dragRel(0,distance,duration=mt)
    pgui.dragRel(-distance,0,duration=mt)
    distance-=20
    pgui.dragRel(0,-distance,duration=mt)

# テキストボックスを選択
pgui.click("text.png")
pgui.click(400,750)
pyclip.copy('蚊取り線香みたいだ！')# 日本語は一旦クリップボードにコピー
pgui.hotkey('ctrl', 'v')# 貼り付け
```
実行結果
![PyAutoGUI_Trim-_2_.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2242763/6440866c-1b4e-17d4-9030-c4ceadbbb364.gif)

うまくいきました。もっと工夫すれば面白いものが作れそうですね。

# 参考
* [Welcome to PyAutoGUI’s documentation!](https://pyautogui.readthedocs.io/en/latest/mouse.html)
* [PyAutoGUIチートシート](https://qiita.com/HyunwookPark/items/fd1963ac89fc10653a48)
* [【自動化】Pythonでマウスとキーボードを操る](https://qiita.com/konitech913/items/301bb63c8a69c3fcb1bd)
* [Python Automation with PyAutoGUI | Full Course With Projects!](https://www.youtube.com/watch?v=3PekU8OGBCA&t=1183s)