web-dev-qa-db-ja.com

Python keypressを読み取るためのメソッド?

私はPythonが初めてで、Pythonでゲームとメニューを作成しました。質問は、(raw_)input()を使用するにはキーを押すたびにEnterキーを押す必要があるため、下矢印キーを押すとすぐに次のメニュー項目が選択されるか、ゲーム内で下に移動するようにしたいのです。現時点では、「down」と入力してEnterキーを押す必要があります。私もかなりの研究をしましたが、単一のkeyDown()メソッドを実現するためだけに、巨大なモジュール(pygameなど)をダウンロードしたくないです。それで、私が見つけられなかった簡単な方法はありますか?

編集:msvcrt.getch()がうまくいくことがわかりました。 keyDown()ではありませんが、機能します。しかし、私はそれをどのように使用するかわからない、それは非常に奇妙に見える、ここで何か助けがありますか?これは私が現時点で得たものです:

from msvcrt import getch
while True:
    key = getch()
    print(key)

ただし、これらすべてのナンセンスバイトを与え続けます。たとえば、下矢印は次のとおりです。

b'\xe0'
b'P'

そして、私はそれらを使用する方法がわかりません、私はchr()と比較しようとし、さらにord()を使用しようとしましたが、実際には比較を行うことができません。私がやろうとしているのは基本的にこれです:

from msvcrt import getch
while True:
    key = getch()
    if key == escape:
        break
    Elif key == downarrow:
        movedown()
    Elif key == 'a':
        ...

など...何か助け?

43
user1632861

自分ですべてのものをテストすることでそれを理解しました。それに関するトピックを見つけることができなかったので、ここで解決策を残します。これは唯一のソリューションでも最良のソリューションでもないかもしれませんが、私の目的(ゲッチの制限内)で機能し、何もしないよりはましです。

注:すべてのキーと実際のキーの押下を認識する適切なkeyDown()は依然として評価されています。

解決策:ord()- functionを使用して最初にgetch()を整数に変換します(仮想キーコードであると推測しますが、確かではありません)。必要なキーを表す実際の数値への結果。また、必要に応じて、返される数値の周りにchr()を追加して、文字に変換することができます。ただし、私は主に下矢印、ESCなどを使用しているため、それらを文字に変換するのは愚かなことです。最終的なコードは次のとおりです。

from msvcrt import getch
while True:
    key = ord(getch())
    if key == 27: #ESC
        break
    Elif key == 13: #Enter
        select()
    Elif key == 224: #Special keys (arrows, f keys, ins, del, etc.)
        key = ord(getch())
        if key == 80: #Down arrow
            moveDown()
        Elif key == 72: #Up arrow
            moveUp()

また、他の誰かが必要な場合は、Googleからキーコードを簡単に見つけることができます。または、pythonを使用してキーを押すだけでもかまいません。

from msvcrt import getch
while True:
    print(ord(getch()))
59
user1632861

MSDN getch のドキュメントを参照してください。具体的には:

_getchおよび_getwch関数は、文字をエコーせずにコンソールから単一の文字を読み取ります。これらの関数はいずれも、CTRL + Cの読み取りには使用できません。機能キーまたは矢印キーを読み取る場合、各機能を2回呼び出す必要があります。最初の呼び出しは0または0xE0を返し、2番目の呼び出しは実際のキーコードを返します。

Python関数は文字を返します。 ord()など、テスト可能な整数値を取得するためにkeycode = ord(msvcrt.getch())を使用できます。

したがって、0x00または0xE0を読み取る場合は、もう一度読み取り、矢印またはファンクションキーのキーコードを取得します。実験から、0x00はF1-F10(0x3B-0x44)の前に、0xE0は矢印キーとIns/Del/Home/End/PageUp/PageDownの前にあります。

10
Mark Tolonen

すべての回答と元の質問にコメントする必要があるため、これをコメントとして投稿したくありませんでした。

すべての答えはMSVCRT Microsoft Visual C Runtimeに依存しているようです。その依存関係を回避したい場合:

クロスプラットフォームサポートが必要な場合は、次のライブラリを使用してください。

https://pypi.org/project/getkey/#files

https://github.com/kcsaff/getkey

よりエレガントなソリューションを可能にすることができます。

コード例:

from getkey import getkey, keys
key = getkey()
if key == keys.UP:
  ...  # Handle the UP key
Elif key == keys.DOWN:
  ...  # Handle the DOWN key
Elif key == 'a':
  ...  # Handle the `a` key
Elif key == 'Y':
  ...  # Handle `shift-y`
else:
  # Handle other text characters
  buffer += key
  print(buffer)
1
Ken
from msvcrt import getch

pos = [0, 0]

def fright():
    global pos
    pos[0] += 1

def fleft():
    global pos 
    pos[0] -= 1

def fup():
    global pos
    pos[1] += 1

def fdown():
    global pos
    pos[1] -= 1

while True:
    print'Distance from zero: ', pos
    key = ord(getch())
    if key == 27: #ESC
        break
    Elif key == 13: #Enter
        print('selected')
    Elif key == 32: #Space
        print('jump')
    Elif key == 224: #Special keys (arrows, f keys, ins, del, etc.)
        key = ord(getch())
        if key == 80: #Down arrow
            print('down')
            fdown
        Elif key == 72: #Up arrow
            print('up')
            fup()
        Elif key == 75: #Left arrow
            print('left')
            fleft()
        Elif key == 77: #Right arrow
            print('right')
            fright()
1
Tommy L