我真的在為 python3 中的緩沖而苦苦掙扎。我正在嘗試實(shí)現(xiàn)一個(gè)簡(jiǎn)單的收音機(jī)。我有一個(gè)接收器類。它向用戶顯示可用的電臺(tái)。這些電臺(tái)是動(dòng)態(tài)的,因此它們會(huì)出現(xiàn)和消失。Welcome to the radio, select station you want to listen to.> 1) Rock Station 2) Hip Hop Station 3) Country Station所以接收器必須同時(shí)等待輸入:來自管道(關(guān)于新站顯示/消失的信息)和來自標(biāo)準(zhǔn)輸入(用戶可以使用向上和向下箭頭來更改站)。此外,當(dāng)用戶使用箭頭鍵更改電臺(tái)時(shí),我必須一次從標(biāo)準(zhǔn)輸入讀取一個(gè)字符。這就是標(biāo)準(zhǔn)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()我在互聯(lián)網(wǎng)上找到了如何從標(biāo)準(zhǔn)輸入中逐個(gè)讀取字符:Python 從用戶讀取單個(gè)字符 并且它確實(shí)有效,但與select.select.
1 回答
白衣染霜花
TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超10個(gè)贊
我在此處粘貼來自 VPfB 評(píng)論的解決方案:
"raw tty 模式打開到只讀取一個(gè)字符然后關(guān)閉。當(dāng) select 處于活動(dòng)狀態(tài)時(shí),它被關(guān)閉,因?yàn)樵?select 之后調(diào)用了獲取一個(gè)字符的例程。你應(yīng)該打開 raw tty在選擇循環(huán)之前輸入,退出循環(huán)后恢復(fù) tty 設(shè)置。”
添加回答
舉報(bào)
0/150
提交
取消
