我正在撰寫某種具有非常簡單界面的終端聊天應用程式:
[Me] Here I write my messages.
[Me] When the Enter key is pressed, the message is sent to other users.
[user1] Other users can also send me messages.
[user2] Their usernames are shown at the start of the line, between square brackets.
這個應用程式的主執行緒會一直等到用戶寫一條訊息并按下 Enter 鍵:
msg = input('[Me] ')
# Do stuff with msg...
并且從其他用戶接收到的訊息通過一個簡單的print函式呼叫(在其他執行緒中運行)顯示在螢屏上:
print(f'\n[{msg_author}] {msg_content}')
問題是我無法以一種漂亮的方式處理從其他用戶那里收到的訊息的列印。例如,收到一條新訊息后,螢屏的狀態可能是下一個:
[Me]
[user1] New message appeared!
由于print函式因為有新訊息而運行,現在app還在等我寫訊息,但是游標在新行(注意最后一個空行),所以如果我開始寫訊息,它會像這樣顯示
[Me]
[user1] New message appeared!
I'm writing here...
當螢屏更新為更漂亮的方式時
[user1] New message appeared!
[Me] This will be the way!
當我寫了我的新訊息的某些部分(不按 Enter 鍵)并收到一條新訊息時,這甚至是一個更大的問題:
[Me] I have still not finished this message...
[user1] Another message appeared!
我正在寫的訊息應該像這樣顯示:
[user1] Another message appeared!
[Me] I have still not finished this message... And I would like to continue it down here!!!
我知道CSI 序列的存在,但我相信它們無助于解決這個問題(實際上,我什至不知道這是否可以使用input請求訊息的函式來解決)。
uj5u.com熱心網友回復:
僅使用inputand ,您將有一段艱難或不可能的時光print。建議您查看以下任何一個:
- https://github.com/erikrose/blessings
- https://urwid.org/
uj5u.com熱心網友回復:
您似乎正在撰寫“控制臺應用程式”。您需要知道的第一件事是控制臺不是您的應用程式的一部分。它是一個完全獨立的東西,通過“管道”與您的應用程式進行通信。控制臺是對 20 世紀計算機終端的模擬,計算機終端最初不是為可以與等待輸入異步產生輸出的應用程式設計的。
IMO 你有兩個選擇。更好的方法是構建一個完整的 GUI 應用程式而不是控制臺應用程式。為此,您需要使用PyQt5、WxPython等GUI 框架。不幸的是,如果您還沒有進行過任何 GUI 編程,那么在進入正題之前,您需要學習很多知識能夠創建一個類似聊天的 GUI,可以像智能手機上的訊息應用程式一樣流暢地運行。
另一種選擇是構建一個控制臺應用程式,該應用程式使用ANSI 轉義序列來創建有點類似于 GUI 的用戶體驗。我強烈建議您使用諸如ncurses 之類的 3rd 方庫來幫助解決此問題。仍然會有一些學習曲線,但可能不會那么陡峭。
IMO:對于使用 ncurses 的第一次剪輯,我會將控制臺螢屏分為兩個視窗;底部的一個小訊息,本地用戶可以編輯他們的下一條訊息,而一個大的則填滿螢屏的其余部分,本地用戶可以在其中看到他們以前的訊息與來自遠程用戶的訊息交織在一起。
我自己對 ncurses 做得還不夠,無法向您展示任何示例代碼。但也許您可以在 Internet 上找到示例。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/383613.html
上一篇:python提供同步緩沖區嗎?
