2017-01-11 10 views
0

私は、Pythonで単一のキー押しを読み取る方法について多くの質問をしました。 Windowsの場合、答えは、動作するmsvcrtモジュールを使用すると言います。Python 2.7:Linuxでの単一のキー押下(特殊文字を含む)を読むにはどうすればよいですか?

import termios, fcntl, sys, os 
def kbhit(): 
    fd = sys.stdin.fileno() 
    oldterm = termios.tcgetattr(fd) 
    newattr = termios.tcgetattr(fd) 
    newattr[3] = newattr[3] & ~termios.ICANON & ~termios.ECHO 
    termios.tcsetattr(fd, termios.TCSANOW, newattr) 
    oldflags = fcntl.fcntl(fd, fcntl.F_GETFL) 
    fcntl.fcntl(fd, fcntl.F_SETFL, oldflags | os.O_NONBLOCK) 
    try: 
     while True: 
      try: 
       c = sys.stdin.read(1) 
       return True 
      except IOError: 
       return False 
    finally: 
     termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm) 
     fcntl.fcntl(fd, fcntl.F_SETFL, oldflags) 

またはこの:しかし、Linuxの場合、彼らはこのようなものを使用

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 
getch = _Getch() 
これら二つの問題は、彼らがCNTRL-Cなどの特殊文字を読んでいないということです

(^ C)または矢印キー。矢印キーのような特殊文字を含むを含む単一のキー押しを読むLinuxの方法はありますか?

答えて

0

チェックコードのこの作品:意図したように私の場合は

def AllKeys(NormalInput=1): 
    """ Detect Key Input """ 

    import termios, sys, tty 

    fd = sys.stdin.fileno() 
    old_settings = termios.tcgetattr(fd) 

    tty.setraw(fd) 
    tty.setcbreak(fd) # Control + C 

    try: 
     #while True: 
     ch = sys.stdin.read(NormalInput) 

     if ch == '\x1b': 
     ch = ch.lstrip(' ') 
     ch += sys.stdin.read(2) 

    finally: 
     termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) 
    return ch 

それは働きます!あなたは文字がUinput(仮想と仮想キーボード入力のために受信処理するサーバーで簡単にこれを拡張することができ

import socket 

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 

while True: 

    try: 

     InKey = AllKeys() 

     print InKey 

     if InKey == "\x03": 
      raise KeyboardInterrupt 

     elif InKey == '~': 
      break 

     else: 
      sock.sendto(InKey, (UDP_IP, UDP_PORT)) 

    except KeyboardInterrupt: 
     break 

sock.shutdown() 
sock.close() 

:それはちょうどUDPクライアントのこの単純な例を確認し、Ctrl + 'シャア

を検出しますHIDデバイス)。次に、Iptablesのルールを使用してポート制御で保護します。セキュリティのためにsshトンネリングを追加してください。それ以外の場合は、ARPキャッシュポイズニング(MITM)のテストで平易なデータトラフィックが表示されます。

関連する問題