search
LoginSignup
31

More than 5 years have passed since last update.

posted at

updated at

Pythonでカーソル位置の取得

導入

Facebookがカーソル位置の情報を集めていると、いつだか耳にしました。調べてみたら2013年には話題になっていたようです。1
というわけでPythonでカーソル位置のデータを取得しましょう。

環境

OSはwindows10、Pythonは3.5.2を利用しました。

利用モジュール

カーソル位置を取得する方法はいくつかあるようですが、インストールの容易さなどからPyAutoGUIを選択しました。
- 公式ドキュメント
- 日本語でまとめてる記事

キー操作やクリック操作なども実装できるようでワクワクしますが、今回は触れません。
pipを使ってインストールしましょう。

pip install pyautogui

OSがmacだとpyobjc-coreとpyobjcも同時にインストールする必要があるそうです。

カーソル位置取得方法

pyautogui.position 関数で、カーソルが位置するx座標とy座標を取得します。

>>> pyautogui.position()
(255, 939)

(0, 0)が画面の一番左上、(画面サイズ横, 画面サイズ縦)が画面の一番右下を表します。

実行してみる

今回は0.1秒おきに1分間データを取得します。
あとで使いたいので、pyautogui.sizeでウインドウサイズも取得しておきます。

get_cursor.py
# -*- coding: utf-8 -*-
import pyautogui
import time
from datetime import datetime

def get_now():
    now = datetime.now().strftime("%Y/%m/%d %H:%M:%S")
    return now

def get_cursor_loop(loop_second):
    """
    0.1秒ずつ、指定秒数分カーソル位置を取得

    args
    ----
    loop_second:int
    データを取得する秒数
    """
    times = []
    positions = []

    for _ in range(0, loop_second*10):
        # 時刻とカーソル位置の取得
        now = get_now()
        x, y = pyautogui.position()

        # リストに情報を追加
        times.append(now)
        positions.append([x, y])

        # sleep
        time.sleep(0.1)

    return times, positions

def get_window_size():
    window_size = pyautogui.size()
    return window_size

if __name__ == '__main__':
    times, positions = get_cursor_loop(60)
    window_size = get_window_size()

データは取れたのでプロットしてみましょう。
今回はパッと見たかったのでseaborn.jointplotを使っています。

plot_cursor.py
import numpy as np
import pandas as pd
import seaborn as sns

data = np.array(positions)
df = pd.DataFrame(data, columns=['x', 'y'])

# (0,0)座標が画面の左上なのでy軸のみ順番を反転
sns.jointplot(data=df, x='x', y='y', xlim=(0, window_size[0]), ylim=(window_size[1], 0))

joint_plot.png

左下の方に固まっていますね。この記事を書きながらデータ取ったので、エディタがある左側に寄ってる気がします。

おわりに

簡単にデータを集めることができました。データの使い道はいろいろありそうですが、例えばサンプルデータを作りたいときに使えるかもしれませんね。(分布もへったくれもないですが)

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
What you can do with signing up
31