私は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':
...
など...何か助け?
自分ですべてのものをテストすることでそれを理解しました。それに関するトピックを見つけることができなかったので、ここで解決策を残します。これは唯一のソリューションでも最良のソリューションでもないかもしれませんが、私の目的(ゲッチの制限内)で機能し、何もしないよりはましです。
注:すべてのキーと実際のキーの押下を認識する適切な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()))
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の前にあります。
すべての回答と元の質問にコメントする必要があるため、これをコメントとして投稿したくありませんでした。
すべての答えは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)
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()