Pythonでキーボードアシストを作る

Pythonの入門本を読み終わって何も作ってなかったのでPythonでキーボードの入力アシストしてくれるものを作ってみました。
`{`を打ったら自動で`}`を打ってくれる感じです。

#pyHooked
バックグラウンドで実行中にキー入力を取得するためにpyHookedを使います

インストール
[pyHooked](https://github.com/ethanhs/pyhooked)

```
pip install pyHooked
```
とりあえずはGithubのexample.pyの通りイベントハンドラを作成します

```Python:keybord.py
from pyhooked import Hook, KeyboardEvent, MouseEvent


def handle_events(args):
    if isinstance(args, KeyboardEvent):
        print(args.key_code)
        if args.current_key == 'A' and args.event_type == 'key down' and 'Lcontrol' in args.pressed_key:
            print("Ctrl + A was pressed")
        elif args.current_key == 'Q' and args.event_type == 'key down' and 'Lcontrol' in args.pressed_key:
            hk.stop()
            print('Quitting.')

    if isinstance(args, MouseEvent):
        if args.mouse_x == 300 and args.mouse_y == 400:
            print("Mouse is at (300,400") 

hk = Hook()  # make a new instance of PyHooked
hk.handler = handle_events  # add a new shortcut ctrl+a, or triggered on mouseover of (300,400)
hk.hook()  # hook into the events, and listen to the presses
```

#pyautogui
pyautoguiは自動でキーボード入力してくれたりマウスの操作をしてくれます
インストール

```
pip install pyautogui
```

キーボード検知と自動入力ができるようになったので

```python:keybord.py
import pyautogui as pgui
from pyhooked import Hook, KeyboardEvent, MouseEvent


def handle_events(args):
    if isinstance(args, KeyboardEvent):
        if args.key_code == 56 and args.event_type == 'key down' and 'Lshift'in args.pressed_key:
            pgui.typewrite([')', 'left'])

        elif args.key_code == 219 and args.event_type == 'key down' and 'Lshift'in args.pressed_key:
            pgui.typewrite(['}', 'left'])

        elif args.key_code == 219 and args.event_type == 'key down' and 'Lshift' not in args.pressed_key:
            pgui.typewrite([']', 'left'])

        elif args.key_code == 188 and args.event_type == 'key down' and 'Lshift'in args.pressed_key:
            pgui.typewrite(['>', 'left'])

        elif args.key_code == 190 and args.event_type == 'key down' and 'Lshift'not in args.pressed_key:
            pgui.typewrite(['return'])

        elif args.current_key == 'Q' and args.event_type == 'key down' and 'Lcontrol' in args.pressed_key:
            hk.stop()
            print('Quitting.')

hk = Hook()
hk.handler = handle_events
hk.hook()

```
今回はkey_codeで判定しています
`typewrite()`でキーボード入力をすることができます。
`typewrite([')'])`で`)`とキーボード入力されます、`typewrite([')', 'left'])`で`)`と入力されたあとカーソルを左に移動してくれます。

これでいい感じに動いてくれると思ったんですがpyautoguiの入力速度が速すぎて自分のキー入力が検知されたあと先に自動入力がされ、`8(`こんな感じで入力されてしまいます。
なので

```python:keybord.py
import pyautogui as pgui
from pyhooked import Hook, KeyboardEvent, MouseEvent
from time import sleep


def handle_events(args):
    if isinstance(args, KeyboardEvent):
        if args.key_code == 56 and args.event_type == 'key down' and 'Lshift'in args.pressed_key:
            sleep(0.3)
            pgui.typewrite([')', 'left'])

        elif args.key_code == 219 and args.event_type == 'key down' and 'Lshift'in args.pressed_key:
            sleep(0.3)
            pgui.typewrite(['}', 'left'])

        elif args.key_code == 219 and args.event_type == 'key down' and 'Lshift' not in args.pressed_key:
            sleep(0.3)
            pgui.typewrite([']', 'left'])

        elif args.key_code == 188 and args.event_type == 'key down' and 'Lshift'in args.pressed_key:
            sleep(0.3)
            pgui.typewrite(['>', 'left'])

        elif args.key_code == 190 and args.event_type == 'key down' and 'Lshift'not in args.pressed_key:
            sleep(0.3)
            pgui.typewrite(['return'])


        elif args.current_key == 'Q' and args.event_type == 'key down' and 'Lcontrol' in args.pressed_key:
            hk.stop()
            print('Quitting.')

hk = Hook()
hk.handler = handle_events
hk.hook()
```

`sleep()`を噛ませます。
おそらく0.3秒以下だと先に自動入力されしまいます。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">昨日ちょろっと書いたキーボード入力アシストしてくれるやつ <a href="https://t.co/Mb8wrqiQZG">pic.twitter.com/Mb8wrqiQZG</a></p>&mdash; ガレバレ (@garebare521) <a href="https://twitter.com/garebare521/status/1055714508637790208?ref_src=twsrc%5Etfw">2018年10月26日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


これでこんな感じで動いてくれると思います。

###参考にさせていただいたサイト
[Pythonでバックグラウンド実行中にキー入力を取得する(windows)](https://qiita.com/yukiB/items/586b20c58b16b5d3917c)
[Pythonでキーボード操作！キーを打たずに自動化できちゃう！？](https://www.lisz-works.com/entry/pyautogui-key)