[Python]pynputでマウスのクリックイベントを取得して処理する

マウスのクリックイベントを取得して、処理をさせてみます。
pynputというライブラリを使うと楽に実装できました。

pynput のインストール

pip install pynput

サンプルを動かしてみる

まずは公式ドキュメントのサンプルコードを書いてみます。

from pynput import mouse

def on_move(x, y):
    print('Pointer moved to {0}'.format(
        (x, y)))

def on_click(x, y, button, pressed):
    print('{0} at {1}'.format(
        'Pressed' if pressed else 'Released',
        (x, y)))
    if not pressed:
        # Stop listener
        return False

def on_scroll(x, y, dx, dy):
    print('Scrolled {0} at {1}'.format(
        'down' if dy < 0 else 'up',
        (x, y)))

# Collect events until released
with mouse.Listener(
        on_move=on_move,
        on_click=on_click,
        on_scroll=on_scroll) as listener:
    listener.join()

実行すると、マウスの位置情報を表示し続け、クリックすると停止します。

$ python pynput_sample.py
Pointer moved to (-299.82421875, 508.1953125)
Pointer moved to (-295.06640625, 510.5703125)
Pointer moved to (-291.7734375, 512.76171875)
...
Pressed at (-268.22265625, 399.65625)
Released at (-268.22265625, 399.65625)

具体的に処理をさせてみる

サンプルの書き方だと変数を取り扱うのが面倒だったため、クラスにしました。

仕様は以下です。

  • クリックするとクリック位置を出力
  • 5回クリックすると終了
from pynput import mouse

class Monitor:
    def __init__(self):
        self.counter = 0
        self.over_count = 5

    def count(self):
        self.counter += 1
        print('Count:{0}'.format(self.counter))

    def is_over(self):
        return True if self.counter >= self.over_count else False

    def call(self):
        self.count()
        if self.is_over():
            print('Done')
            self.listener.stop() # 規定回数過ぎたら終了

    def on_click(self, x, y, button, pressed):
        print('{0} at {1}'.format(
            'Pressed' if pressed else 'Released',
            (x,y)))

        if pressed:
            self.call()

    def start(self):
        with mouse.Listener(
            on_click=self.on_click) as self.listener:
            self.listener.join()


monitor = Monitor()
monitor.start()

実行してみます。

$ python pynput_monitor.py   
Pressed at (-517.97265625, 743.3515625)
Count:1
Released at (-517.97265625, 743.3515625)
Pressed at (-294.79296875, 675.2890625)
Count:2
Released at (-294.79296875, 675.2890625)
Pressed at (-158.21484375, 623.69921875)
Count:3
Released at (-158.21484375, 623.69921875)
Pressed at (-158.21484375, 623.97265625)
Count:4
Released at (-158.21484375, 623.97265625)
Pressed at (-158.21484375, 624.24609375)
Count:5
Done
$ 

まとめ

pynputを使って、マウスクリックを取得して処理をさせることができました。

参考