9

どのキーが押されたかを知る必要がありますが、文字のコードは必要ありません。取得したキーが「a」または「A」であっても、誰かが「A」キーを押したときを知りたいので、他のすべてのキーと同様です.

PyGame やその他のライブラリ (Tkinter を含む) を使用できません。Python 標準ライブラリのみ。これは、グラフィカル インターフェイスではなく、端末で行う必要があります。

文字コードは必要ありません。キーコードを知る必要があります。

元:

ord('a') != ord('A')                      # 97 != 65
someFunction('a') == someFunction('A')    # a_code == A_code
4

8 に答える 8

25

tty標準モジュールを参照してください。tty.setcbreak(sys.stdin)を使用して、デフォルトの行指向 (cooked) モードから文字指向 (cbreak) モードに切り替えることができます。sys.stdin から単一の文字を読み取ると、次に押されたキーボード キーになります (コードが生成される場合)。

import sys
import tty
tty.setcbreak(sys.stdin)
while True:
    print ord(sys.stdin.read(1))

注: ソリューションは Unix (Linux を含む) のみです。

編集: Windows ではmsvcrt.getche() / getwche( ) を試してください。/私には試す場所がありません...


編集 2: 関数でctypes.windll ( SO の例を参照) を介して win32 低レベル コンソール API を利用しReadConsoleInputます。キープレスを除外し、値e.EventType==KEY_EVENTを探す必要がありe.Event.KeyEvent.wVirtualKeyCodeます。アプリケーションの例 (Python ではなく、アイデアを得るために) はhttp://www.benryves.com/tutorials/?t=winconsole&c=4にあります。

于 2009-02-22T21:02:36.963 に答える
9

達成しようとしていることに応じて、おそらくpygameなどのライブラリを使用すると、目的が達成されるでしょう。Pygame には、Python の標準ライブラリで通常利用できるものよりも高度なキー押下処理が含まれています。

于 2009-02-22T20:03:45.950 に答える
3

おそらく、「標準」の Python GUI であり、何年も前から python に含まれている Tkinterを使用する必要があります。

データがコマンド ライン プロセスに出入りする方法のため、コマンド ライン ソリューションはおそらく利用できません。GUI プログラム (何らかの種類の) はすべて、(おそらくライブラリでラップされた) イベント ストリームを介してユーザー入力を受け取ります。各イベントは、イベントの詳細の記録になります。キーストローク イベントの場合、レコードにはキーコード、修飾キー ビットフィールド、または何らかのエンコーディングのテキスト文字が含まれる場合があります。どのフィールドとその名前がどのように付けられるかは、呼び出すイベント ライブラリによって異なります。

コマンドライン プログラムは、文字ストリームを通じてユーザー入力を受け取ります。下位レベルのデータをキャッチする方法はありません。myroslav が彼の投稿で説明したように、tty はクック モードでも非クック モードでもかまいません。唯一の違いは、クック モードでは端末が delete や enter などの (一部の) 制御文字を処理し、代わりにプロセスが入力行を受け取ることです。一度に1文字。

それより低い処理には、(OS に依存する) システム コールまたは /dev でのキャラクター デバイスのオープンが必要です。Python の標準ライブラリは、このための標準機能を提供していません。

于 2009-02-22T20:12:31.373 に答える
0

Windows のみで作業する必要がある場合は、msvcrtを試してください。

于 2009-02-22T20:50:47.520 に答える
0

明白な答え:

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()
于 2009-02-26T18:59:04.840 に答える