この記事では、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
を使ってマウスとキーボードを制御・監視する方法を解説しました。
キーボードを監視することでショートカット的な機能も作ることができます。
それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ