2015-12-28 17 views
8

今、私はラズベリーパイとメイクメイクで小さなコードを作ろうとしています。 makey makeyは、特定の連絡先に電源が供給されているときにUSBキーボードとして機能する小さなボードです。私の質問は、Pythonスクリプトの中でそれらのキー押しを検出する最も簡単な方法は何ですか?私は、GPIOピンを使用する方が簡単だと理解していますが、今私はこれを探しています。私は、msvcrt(私が理解しているものはウィンドウズのみです)からgetch()を使用し、pygame.keyを使用してgetKeyを使用するなどの例を見てきました。どちらの論文が一番使いやすいですか?キーが押され、キーが離されたことを検出できるものはありますか?LinuxマシンでPython 3のキー入力を検出する最も簡単な方法は何ですか?

擬似コードコード

import whatever needs importing  

if the "W" key is pressed: 
    print ("You pressed W") 

elif the "S" is pressed: 
    print ("You pressed S") 

など(...は?それはと呼ばれるものということです)。ありがとう。あなたは(その例/ディレクトリから取られた)このような何かを行うことができcurtsies良い軽量モジュール使用

+0

キーバインディングを使用してグラフィカルインターフェイスをチェックアウトすることがあります:tk:https://docs.python.org/3/library/tk.html – LittleByBlue

答えて

9

これは、単一の文字を取得するために、stdinをrawモード(バッファリングを無効にしてEnterを押す必要がない)にする単純なループです。私はあなたがPythonでキーのリリースを検出するためのループに持っていると思う

import tty 
import sys 
import termios 

orig_settings = termios.tcgetattr(sys.stdin) 

tty.setraw(sys.stdin) 
x = 0 
while x != chr(27): # ESC 
    x=sys.stdin.read(1)[0] 
    print("You pressed", x) 

termios.tcsetattr(sys.stdin, termios.TCSADRAIN, orig_settings)  

:あなたは(それを無効にするwithの文のような)よりスマートな何かを行う必要がありますが、あなたはここにアイデアを得ます。

ETAもう少し説明:Linuxの

、あなたのプログラムへの入力は行がをバッファリングされます。これは、オペレーティングシステムが行全体を保持するまで入力をバッファリングすることを意味します。つまり、ユーザーが 'enter'を押すまで、ユーザーが入力したものも表示されません。言い換えれば、あなたのプログラムがユーザに 'w'と入力してこれを実行することを期待している場合、 'w'はユーザが 'enter'を押すまでOSのバッファに座ります。この時点で、行全体がプログラムに渡されるので、ユーザーの入力として文字列 "w \ n"が得られます。

これを無効にするには、ttyをrawモードに入れます。これは、Python関数tty.setrawで行います。これはlinuxのttyドライバを呼び出して、バッファリングを停止するように指示します。私はそれをsys.stdin引数に渡して、のバッファリングをオフにしたいストリームを指定しました。したがって、tty.setraw呼び出しの後、上記のループはユーザーが押すすべてのキーの出力を提供します。

しかし、いったんプログラムが終了すると、ttyはまだrawモードになっています。現代のターミナル設定が提供するパワー(コントロールやエスケープシーケンスを使用する場合など)が得られないので、これは不満足なものです。たとえば、プログラムを終了するときに問題が発生している可能性があります(ctrl-C)。したがって、入力文字の読み込みが終了したらの調理モードに端末を戻す必要があります。 termios.tcsetattrの呼び出しは、単に「端末を私が見つけた方法に戻す」と言っています。それは最初にtermios.tcgetattrを呼び出すことによってこれを行う方法を知っています。プログラムの冒頭に「端末の現在の設定をすべて教えてください」と言います。

すべてのことを理解したら、プログラムに適した機能で簡単に機能をカプセル化することができます。

stdinは、入力がユーザーからあなたに届くストリームです。ウィキペディアはstandard streamsについて詳しく説明しています。

+0

いいえではありません。 – LittleByBlue

+0

これは私が使用したいと思うものです(それはpiですばらしく働いていました)が、私が何をしているのかがはっきりしていません。あなたはこれに関するどんなふざけた文書も知っていますか?コードを分解したり、if文でこれを使用する方法を教えてください。 – montainz09

+0

@ montainz09もう少し説明を追加しました。私はそれが助けて欲しい – Turn

8

:だからあなたのキーボード上のキーを押す

from curtsies import Input 

def main(): 
    with Input(keynames='curses') as input_generator: 
     for e in input_generator: 
      print(repr(e)) 

if __name__ == '__main__': 
    main() 

はあなたにこのような何かを与える:

'a' 
's' 
'KEY_F(1)' 
'KEY_F(2)' 
'KEY_F(3)' 
'KEY_F(4)' 
'KEY_F(5)' 
'KEY_LEFT' 
'KEY_DOWN' 
'KEY_UP' 
'KEY_RIGHT' 
'KEY_NPAGE' 
'\n' 

curtsiesは、端末関連のものの低レベル抽象化としてbpythonによって使用されます。

入力をデコードする基本的な問題は、異なる端末で、xtermまたはgnome-terminalsのような端末エミュレータプログラムが異なるキーコードシーケンスを生成することです。そのため、入力をデコードするためにどの端末設定を使用すべきかを知る必要があります。そのようなモジュールは、そのような細部から抽象化するのに役立ちます。

+0

このソリューションは、KEY_UP(他の中でも特に)を処理するため、受け入れられた答えは – vinzee

関連する問題