我真的在为 python3 中的缓冲而苦苦挣扎。我正在尝试实现一个简单的收音机。
我有一个接收器类。它向用户显示可用的电台。这些电台是动态的,因此它们会出现和消失。
Welcome to the radio, select station you want to listen to.
> 1) Rock Station
2) Hip Hop Station
3) Country Station
所以接收器必须同时等待输入:来自管道(关于新站显示/消失的信息)和来自标准输入(用户可以使用向上和向下箭头来更改站)。
此外,当用户使用箭头键更改电台时,我必须一次从标准输入读取一个字符。
这就是标准select.select不起作用的原因(它等待用户按 ENTER 键):
class _GetchUnix:
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
self.char_reader = _GetchUnix()
[...]
def __read_order_from_user(self,):
k = self.char_reader()
# Check for up/down arrow keys.
if k == '\x1b':
k = self.char_reader()
if k != '[':
return
k = self.char_reader()
if k == 'A':
self.__arrow_down()
if k == 'B':
self.__arrow_up()
# And check for enter key.
if k == '\r':
self.menu[self.option].handler()
def __update_stations(self,):
[...]
def run(self):
self.display()
while True:
rfds, _, _ = select.select([pipe, sys.stdin], [], [])
if pipe in rfds:
self.__update_stations()
if sys.stdin in rfds:
self.__read_order_from_user()
我在互联网上找到了如何从标准输入中逐个读取字符:Python 从用户读取单个字符 并且它确实有效,但与select.select.
白板的微信
杨__羊羊
浮云间
冉冉说
相关分类