【Python】キーボード入力を監視/取得

スポンサーリンク

今回はPythonで『キーボード入力を取得する方法』についてやっていきたいと思います。
サンプルを紹介しますので、参考になったらいいなと思います!
では、作っていきましょう!

準備

Pythonを開発する為の開発環境(IDE)はお任せします。自分の場合、Spyderを使います。
そして、今回使用するパッケージは『pynput』です。パッケージをインストールしてください。

pip install pynput

開発環境とパッケージを準備できたのであれば、早速作っていきましょう!

プログラムの作成

今回の仕様としては、『「Esc」ボタンを押された時にプログラムを終了する』内容で作成します。
実際作った内容をまずは紹介します。
1行目はもちろんパッケージをインポートして下さい。
※今回は、《pynputの中のkeyboard》のみをインポートします。

from pynput import keyboard

class MonKeyBoard:
    def on_press(self,key):
        try:
            print('press: {}'.format(key.char))
        except AttributeError:
            print('spkey press: {}'.format(key))
    
    def on_release(self,key):
        print('release: {}'.format(key))
        if( key == keyboard.Key.esc):
            print("StopKey")
            self.listener.stop()
            self.listener = None
            
    def start(self):
        self.listener = keyboard.Listener(on_press=self.on_press,on_release=self.on_release)
        self.listener.start()
        
    def getstatus(self):
        if(self.listener == None):
            return False       
        return True
        
monitor = MonKeyBoard()
monitor.start()

while(True):
    status = monitor.getstatus()
    #print(str(status))
    if(status == False):
        print("break")
        break

「いやいやコード量多すぎやしッッ!!」って思った方は安心してください。
今から紹介していきますし、ブロックごとで見ると、実際少ないコード量でコーディングされています。
大きく分けて2つに分かれます。

上から説明していきます。

「キーボードモニタ用クラス」について

クラスという塊を宣言します。名前を《MonKeyBoard》としています。

class MonKeyBoard:

その中に4つの関数を定義しています。

キーボードのボタンが押された時のイベント処理(on_press)
■キーボードのボタンが離された時のイベント処理(on_release)
■キーボードの監視を開始[イベントを登録]する関数(start)
■指定のキーボードのボタンが押されたか確認する関数(getstatus)

こうやってみると、実際に書いている内容は数行になりますね。

キーボードのボタンが押された時のイベント処理

押されたボタンを表示するだけの処理を入れています。

def on_press(self,key):
    try:
        print('press: {}'.format(key.char))
    except AttributeError:
        print('spkey press: {}'.format(key))

《AttributeError》が発生した場合は、文字以外の時になります。
(F1やdeleteキーなど)
この書き方をするとテンキーが”None”になってしまった。。。
[print(‘spkey press: {}’.format(key))]
だけの方が全てのボタンに対応しているのでオススメする。

キーボードのボタンが離された時のイベント処理

離されたキーを表示した上で、指定したキーだった時に監視を停止させたい。

def on_release(self,key):
    print('release: {}'.format(key))
    if( key == keyboard.Key.esc):
        print("StopKey")
        self.listener.stop()
        self.listener = None

1行ずつ説明する。

⇩⇩離されたキーを表示する。⇩⇩

print('release: {}'.format(key))

⇩⇩ESCキーであるかの条件分岐⇩⇩

if( key == keyboard.Key.esc):

⇩⇩監視の停止/解放⇩⇩

self.listener.stop()
self.listener = None

キーボードの監視を開始する関数

《pynputのkeyboard》からインポートしたListenerクラスを生成して、実行します。
Listenerクラスに先ほど作った関数(on_pressとon_release)を登録します。

def start(self):
    self.listener = keyboard.Listener(on_press=self.on_press,on_release=self.on_release)
    self.listener.start()

⇩⇩イベントの登録⇩⇩

self.listener = keyboard.Listener(on_press=self.on_press,on_release=self.on_release)

⇩⇩キーボードの押された/離されたの監視を開始する⇩⇩

self.listener.start()

指定のキーボードが押されたかを確認する関数

指定されたキーが押された場合、listenerのインスタンスが”None”になっているのを確認する事で押されたかを判断します。
listenerインスタンスが”None”の時はFalse/それ以外は”True”を返します
※on_release関数の” self.listener = None“が走っているのでlistenerクラスはNoneになっている

def getstatus(self):
    if(self.listener == None):
        return False       
    return True

⇩⇩listenerクラスがNoneである事を確認⇩⇩

if(self.listener == None):

「メイン処理」について

メイン処理については、大きく2つに処理が分けられます。

■キーボードモニタクラスの生成/スタート
■キーボード監視ループ

キーボードモニタクラスの生成/スタート

キーボードの監視を開始します。
さきほど作ったキーボードモニタクラスを生成し、listenerを開始させる関数を実行します。

⇩⇩キーボードモニタ用クラスの生成⇩⇩

monitor = MonKeyBoard()

⇩⇩キーボードのモニタ開始⇩⇩

monitor.start()

キーボード監視ループ

ステータスを取得し”False”の時にループを抜けるようにします。

⇩⇩ループは無限に回るように⇩⇩

while(True):

⇩⇩listenerのステータスを取得⇩⇩

status = monitor.getstatus()

⇩⇩取得したステータスを確認⇩⇩

if(status == False):

⇩⇩ループを抜ける⇩⇩

break

まとめ

パッケージ《pynput》を使って、【指定のキーを取得する方法】を紹介しました。
サンプルコードとしては少し眺めで毛嫌いされるかもしれませんが、分割してみてみると1つ1つは量の少ないサンプルになっています。
ココで注意しなくてはいけないのが、listenerクラスを停止させることを忘れない事です。
停止させないと永遠とプログラムが終わりませんw
※正確にはずっと裏で動いています。
pynput》はRPA(ロボティック・プロセス・オートメーション)にも使われるので、他の使い方もあります。また、マウスの監視も可能です。
興味が沸いた方は、是非とも調べて作ってみるのもいいのかもしれません。

コメント

タイトルとURLをコピーしました