【发布时间】: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