【问题标题】:Python - Read User Input while Printing OutputPython - 在打印输出时读取用户输入
【发布时间】:2014-01-25 21:55:29
【问题描述】:

我正在尝试编写一个(命令行)python 程序,该程序将接受来自用户的输入,同时仍在其上方打印数据。我正在尝试制作一个聊天程序。

例子:

[stuff prints here]
hello
warning: the time is 27:64

Please enter your input: asdf

所以我输入了asdf,但是当我输入时,上面的输出继续更新。如果需要,我可以在生成输出时继续输入。然后,如果我按 Enter 键,就会发生其他事情。输入字段应始终位于输出文本的下方;如果显示更多文本,则输入字段会被下推(但其内容保持不变)。

我的想法是:

  • 这需要某种非阻塞读取...
  • ...或者线程?一个线程用于输入,一个线程用于输出。
  • 我是否需要进行一些光标操作(即向上移动光标、打印输出、将光标返回到用户输入区域)?

我意识到 GUI 会更容易实现。我可能最终会用 tkinter 来做这件事。但是我仍然想知道这种事情是否可以在命令行中的 python 中实现。

谢谢。

编辑: 我忘了提到我确实知道如何使用回车符删除文本 (\r)。问题确实是确保当我擦除该行时,我不会清除用户输入:因此,如果在我打字时出现新行,我不希望我到目前为止的输入被擦除。

【问题讨论】:

  • 非常快速和肮脏的零件解决方案-循环打印输出,当KeyboardInterrupt出现提示输入时。这样你只是偶尔阻塞,而不是经常阻塞。更好的解决方案(特别是对于 linux) - 使用 curses 模块或类似的。
  • @SimonT:忘了说我用回车把那部分写下来了;我会进行编辑以反映这一点。
  • @sweeneyrod 有趣的想法,有一个转义序列开始输入不一定是坏事......但是当然你在输入时看不到新的输出。
  • 有趣的开发(不是解决方案,而是关闭):如果我有一个输入线程和一个连续的输出线程,输出线程将覆盖我的输入。但是:如果我按删除键,会以某种方式调用 control-R(bash 历史控制代码),并且我的行会重新出现。这是一种可能性,尽管我怀疑这是跨平台的。

标签: python user-input


【解决方案1】:

解决此类问题的经典方法是:

  • 让服务器模块监听传入的请求并打印输入
  • 有一个线程化客户端模块(在我们的示例中分叉为 2 个线程)。
  • 通过使用 Python 的线程库,客户端将能够同时运行。

【讨论】:

  • 但是如何打印和接受用户输入?我问的不是网络方面的事情(我已经解决了这个问题),而是事情的 CLI/物流方面。
  • 不确定我是否理解这个问题,但我可以根据我的理解给你一个例子:当你运行应用程序时,理想情况下应该有一个服务器守护进程和两个客户端窗口。客户端可能通过套接字连接到服务器。 Client1 发送一条消息,服务器接收它,检查哪个应该是接收者并将其刷新到相应客户端的输出文本区域。如果你同时写,那不是问题,因为服务器只知道输入,当你按回车时。
  • 对。但是,如果我在输入消息时输入,我希望该消息显示在我的文本输入区域上方。
  • 服务器接收到消息并将其刷新到输出。你还在写你的消息,服务器对此一无所知。最后,当您按 Enter 键时,您的消息会出现在上一条消息的下方。如果您愿意,按时间顺序排序。
  • 如果您对这个答案感到满意,请点击它左侧的“检查”标志接受它。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-19
  • 1970-01-01
  • 1970-01-01
  • 2014-02-16
  • 1970-01-01
  • 2020-11-05
  • 2016-06-15
相关资源
最近更新 更多