【问题标题】:Keeping the user's input intact when outputing to terminal at the same time同时输出到终端时保持用户输入不变
【发布时间】:2017-02-04 09:10:53
【问题描述】:

为了简化,假设我正在尝试用 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,对跨平台兼容性不感兴趣。

【问题讨论】:

    标签: python multithreading python-3.x output


    【解决方案1】:

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

    一种是使用ncurses。为此有 python 绑定。使用ncurses,终端屏幕尽在您的掌控之中,您可以随时打印字符。

    没有ncurses,你不能写在当前行之上。然而,您可以做的是打印一个\r 字符并返回到行首。

    如果你保存了用户的输入(比如他写了foo),并且你想在上面打印bar这一行,你可以输出:

    \rbar\nfoo
    

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

    【讨论】:

    • 谢谢。我是否必须自己跟踪用户输入,或者有没有办法在覆盖之前说“保存当前输入”?即:有没有办法获取尚未刷新的输入?
    • 您应该自己跟踪输入,从输入的最后一个换行开始
    • 发现了具有get_line_buffer() 方法的readline 模块。到目前为止它工作得很好!感谢您为我指明正确的方向。 docs.python.org/3/library/readline.html#module-readline
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    • 2017-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-18
    相关资源
    最近更新 更多