この記事では、Pythonでマウスとキーボードを制御・監視する方法を解説します。
Pythonで入力デバイスを制御・監視するためには pynputパッケージ を使います。
Linkpynput Package Documentation — pynput 1.7.6 documentation
それでは、実際に pynput を使ってマウスとキーボードを制御・監視してみましょう!
pynput
は pip
でインストールできます。以下のコマンドをターミナルで実行してください。
pip install pynput
マウスを制御・監視するには pynput.mouse
を使います。
LinkHandling the mouse — pynput 1.7.6 documentation
マウスを制御するには pynput.mouse.Controller()
から行います。
from pynput import mouse
m = mouse.Controller()
position
プロパティでポインターの現在位置を取得できます。
print(f'現在のポインターの位置: {m.position}')
# 現在のポインタの位置: (793.82666015625, 562.5105590820312)
position
プロパティにタプル渡すことで指定した座標にポインターをセットできます。
m.position = (100, 200)
move()
メソッドを使うことで現在の位置から相対的にポインターを移動できます。
m.move(200, 200)
指定されたボタンをプレスする(押し続ける)には、press()
メソッドを使います。
m.press(mouse.Button.left)
指定されたボタンをリリースする(離す)には、release()
メソッドを使います。
m.release(mouse.Button.left)
指定されたボタンをクリックするには、click()
メソッドを使います。
m.click(mouse.Button.left, 1)
第二引数count
でクリック数を調整できる。以下はダブルクリックとなる。
m.click(mouse.Button.left, 2)
スクロールするには、scroll()
メソッドを使います。第一引数dx
で水平方向のスクロール量、第二引数dy
で垂直方向のスクロール量を指定できます。
m.scroll(0, 10)
マウスを監視するには、pynput.mouse.Listener
を使います。
from pynput.mouse import Listener
Listener()
にコールバック関数を登録することで対応したイベントを監視することができます。コールバック関数については後述します。
Listener()
は、コンテキストマネージャーとして使用可能です。
with Listener() as listener:
listener.join()
# コンテキストマネージャーとして実行すると以下と同等になる
listener.start()
try:
listener.wait()
with_statements()
finally:
listener.stop()
Listener()
は threading.Thread
を継承していて、すべてのメソッドをサポートしています。join()
もその1つです。→ join()
ブロックしない場合は以下のように実行する。
listener = Listener()
listener.start()
リスナーを停止させるには、pynput.mouse.Listener.stop
を呼び出すか、 コールバック関数内で StopException
例外 を発生させる、または False
を返します。
マウスの移動を監視するには、Listener()
の on_move
引数 に x, y の2つの引数を取る関数を指定します。
from pynput.mouse import Listener
# 移動のコールバック関数
def on_move(x, y):
print(f'x: {x}, y: {y}')
# x が 1000 を越えたら...
if x > 1000:
# False を返し、リスナーを停止させる
return False
with Listener(on_move=on_move) as listener:
listener.join()
マウスボタンのクリックを監視するには、Listener()
の on_click
引数 に x, y, button, pressed の4つの引数を取る関数を指定します。
from pynput.mouse import Listener, Button
# クリックのコールバック関数
def on_click(x, y, button, pressed):
print(f'pos: ({x}, {y}), button: {button}, pressed: {pressed}')
# 右クリックを離した際...
if button == Button.right and not pressed:
# リスナーを停止する
return False
with Listener(on_click=on_click) as listener:
listener.join()
スクロールを監視するには、Listener()
の on_scroll
引数 に x, y, dx, dy の4つの引数を取る関数を指定します。
from pynput.mouse import Listener
# スクロールのコールバック関数
def on_scroll(x, y, dx, dy):
print(f'pos: ({x}, {y}), scroll: ({dx}, {dy})')
# 上にスクロールした際...
if dy > 0:
# リスナーを停止
return False
with Listener(on_scroll=on_scroll) as listener:
listener.join()
キーボードを制御・監視するには pynput.keyboard
を使います。
LinkHandling the keyboard — pynput 1.7.6 documentation
キーボードを制御するには pynput.keyboard.Controller
から行います。
from pynput.keyboard import Controller
k = Controller()
特殊なキー(enter や shiftなど)を指定するには pynput.keyboard.Key
を使います。
from pynput.keyboard import Key
Key.enter
Key.shift
通常の文字や数字を指定するには pynput.keyboard.Controller のメソッドの引数に文字列として指定します。
k.press('a')
k.press('A')
指定されたキーをプレスする(押し続ける)には、press()
メソッドを使います。
k.press(Key.enter)
指定されたキーをリリースする(離す)には、release()
メソッドを使います。
k.release(Key.enter)
pressed()
メソッドをコンテキストマネージャーとして使うことで指定したキーを押している間に他の処理を実行することができる。以下では、shift を押している間に a を押して離した。
with k.pressed(Key.shift):
k.press('a')
k.release('a')
pressed()
メソッドには複数のキーを指定することができます。
with k.pressed(Key.shift, Key.ctrl):
k.press('a')
k.release('a')
type()
は、引数に指定された文字列を全て press()
と release()
で入力します。
k.type('abc')
キーボードを監視するには、pynput.keyboard.Listener
を使います。
from pynput.keyboard import Listener
使い方はマウスのリスナーと同じです。コールバックを登録し、スレッドとして実行するだけです。もちろん、コンテキストマネージャーとして使用可能です。
with Listener() as listener:
listener.join()
# コンテキストマネージャーとして実行すると以下と同等になる
listener.start()
try:
listener.wait()
with_statements()
finally:
listener.stop()
ブロックしない方法もマウスのリスナーと同じ。
listener = Listener()
listener.start()
リスナーを停止させるには、pynput.keyboard.Listener.stop
を呼び出すか、 コールバック関数内で StopException
例外 を発生させる、または False
を返します。
キーが押されたかどうかを監視するには、Listener()
の on_press
引数 に key
引数 を取る関数を指定します。
from pynput.keyboard import Listener
def on_press(key):
print(f'押されたキー: {key}')
# 特殊なキーが押された場合にエラーが発生するので例外処理
try:
# 押されたキーが q なら...
if key.char == 'q':
# リスナーを停止する
return False
except:
pass
with Listener(on_press=on_press) as listener:
listener.join()
キーが押されたかどうかを監視するには、Listener()
の on_release
引数 に key
引数 を取る関数を指定します。
from pynput.keyboard import Listener,Key
def on_release(key):
print(f'離されたキー: {key}')
# 特殊なキーは pynput.keyboard.Key で指定
# 離されたキーが ↓ なら...
if key == Key.down:
# リスナーを停止する
return False
with Listener(on_release=on_release) as listener:
listener.join()
この記事では、pynput
を使ってマウスとキーボードを制御・監視する方法を解説しました。
キーボードを監視することでショートカット的な機能も作ることができます。
それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ