質問
私は、キーを押したのですが、文字のコードが必要とされていないものを、私は誰かが取得したキーが「a」または「A」であっても、「」キーを押したときに知りたい、そのために知っている必要があります他のすべてのキーます。
私は、pygameのダウンロードまたは(Tkinterのを含む)他のライブラリを使用することはできません。唯一のPythonの標準ライブラリ。そして、これは、端末ではなく、グラフィカルなインターフェイスで行う必要があります。
文字コードを必要としません。私はKEY CODEを知っておく必要があります。
例:
ord('a') != ord('A') # 97 != 65
someFunction('a') == someFunction('A') # a_code == A_code
解決
のtty の標準モジュールを参照してください。それは、 tty.setcbreak(sys.stdinを)する。 (それがコードを生成する場合)sys.stdinをから単一の文字を読み取ると、次のプレスキーボードのキーになります。
import sys
import tty
tty.setcbreak(sys.stdin)
while True:
print ord(sys.stdin.read(1))
注:ソリューションは、(Linuxを含む)のUnixであるの
。編集:Windowsでは msvcrt.getche(しようと)する / getwche()する。 /私はどこにも試してみていません...
<時間>編集2: ctypes.windll を介してWin32の低レベルコンソールAPIを活用( ReadConsoleInput
機能付き)SO から例を参照。あなたは、キー入力をフィルタリングする必要があります - e.EventType==KEY_EVENT
とe.Event.KeyEvent.wVirtualKeyCode
値を探します。アプリケーション(Pythonで、単にアイデアを得るためではない)の例は、のhttpで見つけることができます:?。//www.benryves.com/tutorials/トン= winconsole&C = 4 の
他のヒント
あなたはおそらくのようなライブラリを使用して、達成しようとしている内容に応じて pygameのに何をしたいだろう。 pygameのは、Pythonの標準ライブラリで通常利用可能であるよりも、より高度なキー押下処理が含まれています。
あなたはおそらく、 '標準' のPythonのGUIである、 Tkinterのして使用する必要があります、そして長年のためのpythonに含まれています。
コマンドラインソリューションは、ため、データがへとコマンドラインプロセスの出る方法で、おそらく利用できません。 GUIプログラム(いくつかのフレーバーまたは他の)(ラップおそらくライブラリ)を介してすべてのレシーブユーザ入力イベントストリーム。各イベントは、イベントの詳細が記録されます。キーストロークイベントでは、レコードはいくつかのエンコーディングではキーコード、修飾キーのビットフィールド、またはテキスト文字のいずれかを含むことがあります。どのフィールド、およびそれらがどのように命名され、あなたが呼び出しているイベントライブラリに依存します。
コマンドラインプログラムは、文字のストリームを介してユーザ入力を受け取ります。下位レベルのデータをキャッチする方法はありません。 myroslavは彼のポストで説明したように、TTYの調理や調理モードにすることができ、削除して、プロセスは入力のラインを受けるように入力しますように調理モードでは、端末ではなく、あなたのために(いくつかの)制御文字を処理することを唯一の違い一度に1文字のます。
それは/ devに(OSに依存)システムコールや開口部のキャラクタデバイスを必要とするよりも低いものを処理します。 Pythonの標準ライブラリには、このための標準的な機能を提供していません。
あなただけが MSVCRT してみてください。
明白な答えます:
someFunction = string.upper
ord('a') != ord('A') # 97 != 65
someFunction('a') == someFunction('A') # a_code == A_code
または、他の(キー)の言葉で:
char_from_user = getch().upper() # read a char converting to uppercase
if char == 'Q':
# quit
exit = True # or something
elif char in ['A', 'K']:
do_something()
など...
ここでは、WindowsとLinuxの両方のプラットフォームで動作しますgetchは関数の実装、基づいていますこのレシピの上:
class _Getch(object):
"""Gets a single character from standard input.
Does not echo to the screen."""
def __init__(self):
try:
self.impl = _GetchWindows()
except ImportError:
self.impl = _GetchUnix()
def __call__(self):
return self.impl()
class _GetchUnix(object):
def __init__(self):
import tty, sys
def __call__(self):
import sys, tty, termios
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
try:
tty.setraw(sys.stdin.fileno())
ch = sys.stdin.read(1)
finally:
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
return ch
class _GetchWindows(object):
def __init__(self):
import msvcrt
def __call__(self):
import msvcrt
return msvcrt.getch()
getch = _Getch()
この関数は、大文字のコードを返します。
def upCcode( ch ):
if(len(ch) == 1):
return ord(ch.upper())
これは小文字の文字コードです。
def lowCcode( ch ):
if(len(ch) == 1):
return ord(ch.lower())
この方法ははるかに簡単です、あなたは外部ライブラリをインポートする必要はありません。
あなたは、あなたの質問に説明「someFunction」であると2つの方法のいずれかを選択する必要があります。ここでは例があります:
OUTPUTます:
# when using upCode():
>> upCcode('a')
65
>> upCcode('A')
65
# when using lowCode():
>> lowCcode('a')
97
>> lowCcode('A')
97
Pythonで pynput のモジュールを見てみましょう。また、あなたが簡単にあなたのコードのキーボードリスナーを作成できる使用の素敵なチュートリアルを持っています。
リスナーのための公式の例があります:
from pynput.keyboard import Key, Listener
def on_press(key):
print('{0} pressed'.format(
key))
def on_release(key):
print('{0} release'.format(
key))
if key == Key.esc:
# Stop listener
return False
# Collect events until released
with Listener(on_press=on_press,
on_release=on_release) as listener:
listener.join()
この情報がお役に立てば幸いです。