好久好久之前,系windows平臺下,用C語言寫過一款貪食蛇遊戲,cmd界面,用kbhit()函數實現非阻塞輸入。系windows平臺下用python依然能夠調用msvcrt.khbit實現非阻塞監聽。但系喺linux下面就冇呢支歌仔唱。python
隨手google咗一下,基本上都用select實現非阻塞監聽,但問題是,監聽的是用select以後是不能像getchar()那樣,即時收到單個字符的輸入,必需要等待回車。linux
通過努力不怠咁google... [好吧,仍是google。沒有google什麼也作不了。]ios
最後系一大堆英文資料入面,拼湊出以下可用的代碼,實現了單個字符非阻塞輸入。windows
show code below.函數
#!/usr/bin/python # -*- coding: utf-8 -*- """ python non blocking input """ __author__ = 'Zagfai' __version__= '2013-09-13' import sys import select from time import sleep import termios import tty old_settings = termios.tcgetattr(sys.stdin) tty.setcbreak(sys.stdin.fileno()) while True: sleep(.001) if select.select([sys.stdin], [], [], 0) == ([sys.stdin], [], []): c = sys.stdin.read(1) if c == '\x1b': break sys.stdout.write(c) sys.stdout.flush() termios.tcsetattr(sys.stdin, termios.TCSADRAIN, old_settings) print raw_input('123:')
其中用到兩個模塊,分別系termios、tty,用來控制tty的輸入模式,由行輸入變爲單字符。google
END.spa