我真的在為 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 chself.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.
1 回答

白衣染霜花
TA貢獻1796條經驗 獲得超10個贊
我在此處粘貼來自 VPfB 評論的解決方案:
"raw tty 模式打開到只讀取一個字符然后關閉。當 select 處于活動狀態時,它被關閉,因為在 select 之后調用了獲取一個字符的例程。你應該打開 raw tty在選擇循環之前輸入,退出循環后恢復 tty 設置?!?/p>
添加回答
舉報
0/150
提交
取消