亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Python – 在無緩沖的標準輸入上選擇

Python – 在無緩沖的標準輸入上選擇

米琪卡哇伊 2022-10-18 16:14:51
我真的在為 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>


查看完整回答
反對 回復 2022-10-18
  • 1 回答
  • 0 關注
  • 136 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號