2016-09-26 63 views
2

爲了簡化起見,我們假設我正在嘗試在Python中編寫命令行雙向對話。我希望用戶在命令提示符下輸入他的消息input(),但是監聽線程可以隨時打印消息。默認情況下,這會「打破」用戶的輸入。在視覺上是這樣的:同時輸出到終端時保持用戶的輸入不變

userB>Stop interuserA wrote:Hey check this out! 
rupting me! 

我能找到最接近的是this answer here這幾乎是,但不完全是,我正在尋找,但它並指出我朝着blessings包這似乎是什麼我需要(雖然我很滿意任何軟件包的答案,甚至純粹的ANSII)。

我想要實現的是打印來自輸出輸出線程以上的用戶的輸入,以便他的文本不會中斷。比方說,用戶鍵入:

userB>Stop inter 

突然的消息來自從線程,但我們的用戶的輸入不剎:

userA says: Ok I won't interrupt you 
userB>Stop inter 

我應該我線程理論print_incoming_message()方法模樣來實現這個?

注意:我使用Linux,對跨平臺兼容性不感興趣。

回答

1

有兩種方法可以做到這一點。

一種是使用ncurses。有這個python綁定。通過ncurses,終端屏幕處於完全控制之下,您可以隨時打印字符。

如果沒有ncurses,則無法在當前行的上方寫入。 可以做什麼,但是,打印一個\r字符並返回到行的開頭。

如果保存用戶的輸入(說他寫foo),並且你要打印的行bar上面,可以輸出:

\rbar\nfoo 

這將覆蓋當前線,並引進一個新行,向下移動用戶的輸入。效果類似,但不會像ncurses那樣具有防篡改功能。

+0

謝謝。我是否必須自己跟蹤用戶輸入,還是有辦法在覆蓋前說「保存當前輸入」?即:有沒有辦法獲得尚未被刷新的輸入? – Juicy

+0

你應該自己追蹤輸入,從最後一個換行符開始 – slezica

+1

發現了'readline'模塊,它有'get_line_buffer()'方法。到目前爲止它工作得很好!感謝您指點我正確的方向。 https://docs.python.org/3/library/readline.html#module-readline – Juicy