芋の独り言

当ブログへのアクセスは当ブログのプライバシーポリシーに同意したものとみなします.

Python:キーボードからの読み込み

コンソールへのデータ出力時にカーソルキー移動できたらなぁっと思い,調べた結果, キーボードからキー入力はPython標準のライブラリmsvcrtでできるとのこと. 単純にキー入力を読み込むだけなら,以上のモジュールのimportでよいってことです. tkinterといったGUIモジュールは必要ナイデス.

それじゃあ使ってみましょう. まず,msvcrtをimportします. あとはmsvcrt.getch()を実行するだけ. msvcrt.getch()がキー入力を補足し,入力によってバイト文字列を返します. whileループ内でmsvcrt.getch()を実行すれば,永遠にキー入力を受け取ることができるわけです. 以下のような感じです. ちなみにPrtScや半角全角キー,Alt,Ctrlキー単体とかではmsvcrt.getch()は反応しません(値を返さない).

import msvcrt

while True:
    key = msvcrt.getch() # キー入力を受け取る

    # ファンクションキーやカーソルキーなど特殊なキー入力の場合
    if key == b'\xe0':
        # 再度キー入力読み込みを実行する必要あり
        key = msvcrt.getch()
        if key == b'H': # カーソルキー上
            # 適当に処理を
        elif key == b'P': # カーソルキー下
            # 適当に処理を
        elif key == b'M': # カーソルキー右
            # 適当に処理を
        elif key == b'K': # カーソルキー左
            # 適当に処理を
        elif key == b';': # ファンクション1
            # 適当に処理を
        elif key == b'<': # ファンクション2
            # 適当に処理を
        elif key == b'S': # Deleteキー
           # 適当に処理を
    # 全角(日本語)入力の時:Enterを押して入力文字を決定し,読み込み
    # 二文字以上の入力はできないっぽい
    elif key == b'\x82': 
        # 再度キー入力読み込みを実行する必要あり
        key = msvcrt.getch()
        if key == b'\x91': # q(全角文字)
            # 適当に処理を
        elif key == b'\xa0': # あ
            # 適当に処理を
        elif key == b'\xed': # わ
            # 適当に処理を
    # 上記で漢字入力を試したが,なんかよく分からん...
    # 別の漢字だと最初の読み込みも違う.
    elif key == b'\x88': 
        # 再度キー入力読み込みを実行する必要あり
        key = msvcrt.getch()
        if key == b'\xf3': # 印
            # 適当に処理を
    # 通常のキー入力
    elif key == b'\r': # Enterキー
        # 適当に処理を
    elif key == b'\x08': # Backspaceキー
        # 適当に処理を
    elif key == b'q': # Qキー(半角(英字)入力の時)
        # 適当に処理を
    elif key == b'Q': # Shift+Qキー(半角(英字)入力の時)
        # 適当に処理を
    elif key == b'\x03': # Ctrl+C
        # 適当に処理を
    elif key == b'\x1a': # Ctrl+Z
        # 適当に処理を
    elif key == b'\x16': # Ctrl+V
        # 適当に処理を
    elif key == b'1': # テンキーの1
        # 適当に処理を
    elif key == b'+': # テンキーの+
        # 適当に処理を

参考