2011-09-05 68 views
3

我已經開始創建一個相對較小的命令行RPG來彎曲我的新發現的Python肌肉,但我已經遇到了一個難題。我使用這個實現的getch(的):是否可以使用getch()獲取不同長度的輸入?

def getch(): 
    fd = sys.stdin.fileno() 
    old_settings = termios.tcgetattr(fd) 
    tty.setraw(sys.stdin.fileno()) 
    key = sys.stdin.read(3) 
    termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) 

key集3個字符閱讀捕捉箭頭鍵。舉例來說,讀入爲ESC[A;用這種方法,我可以使用key[2]來確定是否按下了一個箭頭鍵和哪一個。一切都很好,除了我還想捕捉各種其他按鍵;用於任務日誌的q,用於移動的wasd(按各種順序按下箭頭將是攻擊的方法)等等。問題立即明確;如果getch()僅返回單個字符,則箭頭功能完全丟失。

如果沒有簡單的解決方案,我正在考慮重新考慮箭頭系統,但我幾乎肯定必須有。無可否認,我對tty內的知識知之甚少,但我在某處讀到,如果只讀取1個字符,則箭頭按下的多餘字符將保留在緩衝區中。我該如何去訪問所述緩衝區?或者,有沒有一些巧妙的方法可以告訴stdin期望輸入可變長度?

非常感謝您的幫助。

回答

5

不讀取三個字符。閱讀一個。

如果您剛剛閱讀的一個字符是ESC,請閱讀另一個或兩個字符以查看它是否爲箭頭鍵或其他。如果這是一個q,請爲此做些事,然後重新開始。

+0

這將需要用戶按兩次箭頭鍵,這不是很友好。 –

+0

不,它不。你用'read(1)'替換'read(3)',接着用if語句來查找'\ x1b',然後'read(2)'來查看按下了什麼鍵。 – SingleNegationElimination

+0

啊,是的。非常有意義。謝謝你,令牌。 –

0

如果你考慮開發一個完整的遊戲,PyGame也可能是有用的(最終ncurses)。

getch()代碼片段可以升級爲讀取箭頭鍵,但是如何區分箭頭鍵的第一個字符和ESC鍵?如果用戶按ESC,則所描述的解決方案可能會等待下一次按鍵。

我沒有找到任何解決方案來處理這最後的情況。

相關問題