14

cursesベースのPythonプログラムでキーバインディングを提供したいと思います。getch()理想的な解決策は、おそらくvimのような形式で、読み取り可能な文字列を生成する抽象化レイヤーを周囲に配置することです。

pythoneseの場合:

def get_keycomb(wind):
    string = read_keycomb(wind) # read with wind.getch() as needed
    return string # something like '<C-S-a>'

次に、関数のキーとして文字列を使用することで、マッピングを簡単に実装できますdict

この種の機能を提供するPythonライブラリ、またはすべての名前を手動で提供するよりも簡単にそれを実現する方法はありますか?

4

2 に答える 2

5

すべての非特殊キーのコードは文字の ASCII コードであるため、テーブルの一部は簡単に作成できます。

char_codes = {chr(i):i for i in range(256)}

すべての特殊文字のコードは、curses モジュールで KEY_* 定数として利用できるため、次の方法ですべて取得できます。

specials_codes = {name[4:]: value for name, value in vars(curses).items()
    if name.startswith('KEY_')}

したがって、次のコードでマッピングを作成できます。

import curses

mapping = {chr(i):i for i in range(256)}
mapping.update((name[4:], value) for name, value in vars(curses).items()
    if name.startswith('KEY_'))

print(mapping)
于 2012-05-29T15:13:27.960 に答える
1

入力に ​​curses を使用するのではなく、curses を使用するlibtermkeyと、キー構造を人間が読める文字列との間で変換するための簡単な関数が、まさにこの形式で提供されます。具体的には、関数termkey_strfkeytermkey_strpkey.

http://www.leonerd.org.uk/code/libtermkey/doc/termkey_strfkey.3.html

http://www.leonerd.org.uk/code/libtermkey/doc/termkey_strpkey.3.html

これは C ライブラリですが、Python バインディングがあります。見る

https://github.com/temoto/ctypes_libtermkey

于 2012-06-19T13:21:36.663 に答える