同时输出到终端时保持用户输入完整

Jui*_*icy 5 python multithreading python-3.x output

为了简单起见,假设我正在尝试用 Python 编写命令行双向聊天。我希望用户input()在命令提示符下输入他的消息,但是监听线程可以随时打印消息。默认情况下,这会“破坏”用户的输入。视觉上是这样的:

userB>Stop interuserA wrote:Hey check this out!
rupting me!
Run Code Online (Sandbox Code Playgroud)

我能找到的最接近的是这里的答案,它几乎但不完全是我正在寻找的东西,但它确实向我指出了blessings似乎是我需要的包(尽管我对答案很满意)对于任何软件包,甚至纯 ANSII)。

我想要实现的目标是打印来自用户输入上方的线程的传入输出,以便他的文本不会中断。假设用户正在输入:

userB>Stop inter
Run Code Online (Sandbox Code Playgroud)

突然,一条消息从线程中传入,但我们的用户输入并没有停止:

userA says: Ok I won't interrupt you
userB>Stop inter
Run Code Online (Sandbox Code Playgroud)

print_incoming_message()为了实现这一目标,我的线程理论方法应该是什么样的?

注意:我使用的是 Linux,对跨平台兼容性不感兴趣。

sle*_*ica 3

有两种方法可以做到这一点。

一是使用ncurses。有用于此目的的 python 绑定。有了ncurses,终端屏幕就在您的完全控制之下,您可以随时打印字符。

如果没有ncurses,您将无法在当前行上方写入。然而,您可以\r做的是打印一个字符并返回到行的开头。

如果您保存用户的输入(假设他写了foo),并且您想打印bar上面的行,您可以输出:

\rbar\nfoo
Run Code Online (Sandbox Code Playgroud)

这将覆盖当前行,并引入换行符,将用户的输入向下移动。效果类似,但不会像 那样防篡改ncurses

  • 发现具有“get_line_buffer()”方法的“readline”模块。到目前为止效果很好!感谢您为我指明了正确的方向。https://docs.python.org/3/library/readline.html#module-readline (5认同)