23
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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

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

インストール
pyHooked

pip install pyHooked

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

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

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

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(こんな感じで入力されてしまいます。
なので

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秒以下だと先に自動入力されしまいます。

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

###参考にさせていただいたサイト
Pythonでバックグラウンド実行中にキー入力を取得する(windows)
Pythonでキーボード操作!キーを打たずに自動化できちゃう!?

23
20
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
23
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?