Pythonを使ってツールやゲーム、自動化プログラムを開発していると、ユーザーがどのキーを押したのかをリアルタイムで取得したい場面が必ず出てきます。
しかし、Pythonの標準的な入力関数である input() は、エンターキーが押されるまでプログラムが止まってしまうため、リアルタイムな判定には向きません。
「特定のキーが押された瞬間に処理を実行したい」
「バックグラウンドでキー入力を監視したい」
「ゲームのように矢印キーの入力を即座に反映させたい」
こうした目的を達成するためには、用途に応じた適切なライブラリや手法を選択する必要があります。
この記事では、初心者の方でも迷わず実装できるよう、Pythonでキー入力を判定するあらゆる手法を、標準ライブラリから高度な外部ライブラリまで網羅して解説します。
もくじ
Pythonでのキー入力判定の全体像と選び方
キー入力を判定する手法は、大きく分けて「標準ライブラリを使う方法」と「外部ライブラリを導入する方法」の2つがあります。
どちらを選ぶべきかは、プログラムを実行する環境(WindowsやMac、Linux)や、どのようなアプリを作りたいかによって決まります。
まずは、代表的な手法の比較を確認しましょう。
| 手法・ライブラリ | 特徴 | 主な用途 | 導入の難易度 |
| input() | 標準機能。エンター入力必須。 | 対話型のシンプルなツール | 非常に簡単 |
| msvcrt | Windows標準。リアルタイム取得。 | Windows用コマンドラインツール | 簡単 |
| keyboard | 多機能。グローバル監視が可能。 | 自動化、マクロ、ホットキー | 普通 |
| pynput | マウス操作も監視可能。 | セキュリティツール、ログ取得 | 普通 |
| Pygame | イベント駆動型。高速反応。 | 自作ゲームの開発 | やや高い |
| Tkinter | GUIアプリ専用。 | ウィンドウを持つデスクトップアプリ | 普通 |
このように、「何を作りたいか」によって最適なツールは異なります。
それぞれの具体的な実装方法を詳しく見ていきましょう。
1. 【標準】最もシンプルな input() による判定
最も基本的な方法は、組み込み関数の input() を使うことです。
特別な設定は不要ですが、「入力の最後に必ずエンターキーが必要」という制約があります。
# シンプルな入力判定の例
user_input = input('コマンドを入力してください (qで終了): ')
if user_input == 'q':
print('プログラムを終了します。')
この方法は、ユーザーに文字列をしっかり入力させたい場合には適していますが、「キーを押した瞬間に反応する」という挙動は作れません。
リアルタイム性を求める場合は、次のステップへ進みましょう。
2. 【Windows限定】msvcrt を使ったリアルタイム判定
Windows環境で、コマンドライン上で動くプログラムを作っているなら、標準ライブラリの msvcrt が非常に便利です。
このライブラリを使うと、エンターキーを待たずに、押されたキーを一文字ずつ取得できます。
import msvcrt
print('キーを押してください(Escで終了)')
while True:
if msvcrt.kbhit(): # キーが押されているか確認
key = msvcrt.getch() # 押されたキーを取得(バイト列)
# バイト列を文字に変換
char = key.decode('utf-8')
print(f'押されたキー: {char}')
# Escキー(ASCIIコード27)で終了
if ord(key) == 27:
break
Windows専用という制約はありますが、追加のインストールが不要な点が最大のメリットです。
ちょっとしたコマンドラインツールで「はい(y) / いいえ(n)」を即座に判定したい場合に最適です。
3. 【高機能】keyboard ライブラリによる高度な監視
Windows、Mac、Linuxのマルチプラットフォームに対応し、さらに「他のアプリを開いている間もキーを監視したい(グローバル監視)」という場合には、 keyboard ライブラリが最も強力な選択肢になります。
まず、以下のコマンドでインストールが必要です。
pip install keyboard
import keyboard
# 特定のキーが押されたときに実行する関数
def on_triggered():
print('ホットキー(Ctrl+Shift+S)が押されました!')
# ホットキーの登録
keyboard.add_hotkey('ctrl+shift+s', on_triggered)
print('監視を開始しました。Escキーを押すと終了します。')
# 特定のキーが押されるまで待機
keyboard.wait('esc')
keyboard ライブラリは、ゲームのチートツールやマクロ、スクリーンショット撮影ソフトなど、Pythonプログラムが最前面にない状態でも入力を検知したい場合に非常に役立ちます。
ただし、Linux環境などでは管理者権限が必要になる場合があるため、その点だけ注意が必要です。
4. 【汎用】pynput を使ったリスナーの実装
pynput は、キーボードだけでなくマウスの入力も同様のロジックで扱えるライブラリです。
「リスナー(監視役)」を別スレッドで動かすという構造になっており、メインの処理を止めずにキー入力を監視し続けることができます。
インストール: pip install pynput
from pynput import keyboard
def on_press(key):
try:
print(f'アルファベットキーが押されました: {key.char}')
except AttributeError:
print(f'特殊キーが押されました: {key}')
def on_release(key):
if key == keyboard.Key.esc:
# Stop listener
return False
# リスナーの開始
with keyboard.Listener(on_press=on_press, on_release=on_release) as listener:
listener.join()
この手法は、キーロガーのような動作ログ取得や、複雑な入力シーケンスの判定に向いています。
コードの構造が非常に綺麗に書けるため、中規模以上のプロジェクトでよく利用されます。
5. 【ゲーム開発】Pygame によるイベント取得
「自作の2Dゲームでキャラクターを矢印キーで動かしたい」という目的であれば、 Pygame 一択です。
Pygameは内部でイベントキューという仕組みを持っており、キーが押された瞬間、離された瞬間、押し続けられている状態を非常に正確に判別できます。
import pygame
pygame.init()
screen = pygame.display.set_mode((400, 300))
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# キーが押された瞬間の判定
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
print('左に移動します')
if event.key == pygame.K_SPACE:
print('ジャンプ!')
# 「押し続けられているか」の判定
keys = pygame.key.get_pressed()
if keys[pygame.K_RIGHT]:
# 右キーが押されている間ずっと実行
pass
pygame.quit()
ゲーム開発において、「一回だけ押した」のか「長押ししている」のかを使い分けることは必須です。
Pygameを使えば、それらを直感的なコードで実装できます。
よくある質問
Pythonのキー入力判定を実装する上で、多くの開発者が突き当たる疑問をまとめました。
Q:Macで keyboard ライブラリが動きません。どうすれば良いですか?
A:Mac(macOS)では、セキュリティ上の理由からアクセシビリティ(システム操作)の許可が必要です。システム設定の「プライバシーとセキュリティ」から、実行しているターミナルやIDE(VSCodeなど)に対して、コンピュータの操作を許可する設定を行ってください。また、ライブラリの性質上、 sudo を付けて実行する必要があるケースも多いです。
Q:キー入力を判定する際に、プログラムの動作が重くなることはありますか?
A: while True などの無限ループ内でキーを監視する場合、適切な待機時間を入れないとCPU使用率が100%近くまで跳ね上がることがあります。 time.sleep(0.01) を入れるか、 pynput や Pygame のようなイベント駆動(何かが起きた時だけ処理する)の仕組みを使うことで、動作を軽く保つことが可能です。
Q:矢印キーやShiftキー、Ctrlキーを判別するにはどう書けば良いですか?
A: msvcrt のような低レイヤーなライブラリでは、矢印キーは2回分の信号(スキャンコード)として送られてくるため、判定が少し複雑になります。一方で keyboard や pynput 、 Pygame などの高度なライブラリであれば、 Key.shift や K_UP といった定数が用意されているため、直感的に名前で指定することが可能です。
Q:バックグラウンドで動作中にキーを奪い取る(他のアプリに伝えない)ことは可能?
A: keyboard ライブラリの suppress=True オプションなどを使用すれば、特定のキー入力を「自分のプログラムで消費し、システム全体には伝えない」という挙動(キーフック)が可能です。ただし、これはOSの深層部分に干渉する動作のため、悪用厳禁であることはもちろん、予期せぬシステムの不安定化を招くリスクがあることを理解して使用してください。
Q:特定の文字ではなく、キーの物理的な位置(スキャンコード)で判定できますか?
A:はい、可能です。 keyboard ライブラリなどでは、文字コード(ASCII)ではなくスキャンコード(キーボード上の物理的な位置を示す数値)による判定がサポートされています。これにより、日本語キーボードや英語キーボードといった配列の違いに左右されないツールを作ることができます。
まとめ
Pythonでキー入力を判定する方法は、「どの環境で」「何を動かしたいか」によって正解が異なります。
単に1文字の入力を受け取りたいだけなのに、重厚なゲームエンジンであるPygameを導入するのは非効率ですし、逆にゲームを作りたいのに input() で頑張るのは不可能です。
まずは自分が作ろうとしているプログラムの性質を整理し、「まずは動くものを作る」なら msvcrt や keyboard を、「本格的なUIやゲームを目指す」なら Pygame や Tkinter を選択してみてください。
キー入力の判定ができるようになると、プログラムは一気に「動的なツール」へと進化します。
ユーザーの操作に合わせて自在に反応する、使い勝手の良いアプリケーション開発への第一歩を、ぜひ楽しんで進めてください。
今回紹介したコードをベースに、自分だけの便利なショートカットツールやゲームのプロトタイプを作り始めることが、スキルアップへの最短距離となるはずです。










のやり方完全ガイド|準備・マナー・費用を徹底解説-485x264.jpg)











最も手軽なのは
input()だが、リアルタイム性はないWindowsのCLIツールなら標準ライブラリの
msvcrtが最も軽量で導入しやすい他のアプリを操作中の入力も検知したいなら
keyboardライブラリが最強マウス操作も含めた高度な監視を行いたいなら
pynputのリスナー形式が推奨されるゲーム開発なら
Pygameのイベント取得機能を使うのが最も効率的