今回は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(ロボティック・プロセス・オートメーション)にも使われるので、他の使い方もあります。また、マウスの監視も可能です。
興味が沸いた方は、是非とも調べて作ってみるのもいいのかもしれません。
業務でプログラミング(C#/VB/Python)を作っている。
挫折を何回も繰り返し、幾度の壁を乗り越えてきた。
乗り越えてきた事を忘れないように記録に残す。
同じ思いをしている人への情報提供になれたらと思う。
基本は初心者に向けたプログラムの情報を提供する。
コメント