当前位置: 首页 > 面试题库 >

在python中的input()提示符之前打印文本

闻人飞白
2023-03-14
问题内容

在Python中,是否可以通过控制台中的input()请求用户输入,同时在提示之前的行中打印出文本?它看起来应该像这样:

Text 1
Text 2
Text 3
Please enter something: abc

每当打印新文本时,都应在前一个文本之后和input()提示符之前打印它。而且,它不应打扰用户输入文本。

因此,在打印“文本4”之后,控制台应如下所示:

Text 1
Text 2
Text 3
Text 4
Please enter something: abc

在不使用任何外部库的情况下用Python可以做到吗?

我已经尝试使用\ r,\ b和类似的代码以及线程。我也知道我可能需要一个线程来打印文本,而另一个线程则需要用户输入。


问题答案:

这是使用ANSI / VT100终端控制转义序列的另一种方法。

我们告诉终端仅滚动终端的上部区域,在该区域打印输出数据,以便下部区域(在该下部区域打印输入提示)保持固定。当退出程序时(使用Ctrl`` C),我们需要恢复默认的滚动设置。

该程序首先清除屏幕,然后进入循环,提示用户输入数字n,然后range(n)每行打印一次中的数字,并且延迟很小,以便于查看发生的情况。每个范围的输出都从先前的范围开始。如果用户输入非整数,则将重新打印提示。该readline模块是进口的,这样编辑和历史记录都可以在输入提示;
此模块可能并非在所有平台上都可用。

首先是Python 2版本。

''' Print text in a scrolling region of the terminal above a fixed line for input

    Written by PM 2Ring 2016.05.29

    Python 2 version
'''

from __future__ import print_function
from time import sleep
import readline

# Some ANSI/VT100 Terminal Control Escape Sequences
CSI = '\x1b['
CLEAR = CSI + '2J'
CLEAR_LINE = CSI + '2K'
SAVE_CURSOR = CSI + 's'
UNSAVE_CURSOR = CSI + 'u'

def emit(*args):
    print(*args, sep='', end='')

def set_scroll(n):
    return CSI + '0;%dr' % n

# Height of scrolling region
height = 40

GOTO_INPUT = CSI + '%d;0H' % (height + 1)

emit(CLEAR, set_scroll(height))

try:
    while True:
        #Get input
        emit(SAVE_CURSOR, GOTO_INPUT, CLEAR_LINE)
        try:
            n = int(raw_input('Number: '))
        except ValueError:
            continue
        finally:
            emit(UNSAVE_CURSOR)

        #Display some output
        for i in range(n):
            print(i)
            sleep(0.1)

except KeyboardInterrupt:
    #Disable scrolling, but leave cursor below the input row
    emit(set_scroll(0), GOTO_INPUT, '\n')

这是在Python 2和Python 3上运行的版本。在Python
3上运行时,此脚本将调用shutil.get_terminal_size()以设置滚动区域的高度。这 可能得到的终端大小在Python
2,但代码是相当混乱的,所以我选择了一个固定的高度。

我应该提到,如果在运行时更改终端大小,则此脚本的两个版本都无法很好地应对;适当的处理留给读者练习。:)

''' Print text in a scrolling region of the terminal above a fixed line for input

    Written by PM 2Ring 2016.05.29

    Python 2 / 3 version
'''

from __future__ import print_function
import sys
import readline
from time import sleep

if sys.version_info > (3,):
    # Get the (current) number of lines in the terminal
    import shutil
    height = shutil.get_terminal_size().lines - 1

    stdout_write_bytes = sys.stdout.buffer.write
else:
    height = 40
    input = raw_input
    stdout_write_bytes = sys.stdout.write


# Some ANSI/VT100 Terminal Control Escape Sequences
CSI = b'\x1b['
CLEAR = CSI + b'2J'
CLEAR_LINE = CSI + b'2K'
SAVE_CURSOR = CSI + b's'
UNSAVE_CURSOR = CSI + b'u'

GOTO_INPUT = CSI + b'%d;0H' % (height + 1)

def emit(*args):
    stdout_write_bytes(b''.join(args))

def set_scroll(n):
    return CSI + b'0;%dr' % n

emit(CLEAR, set_scroll(height))

try:
    while True:
        #Get input
        emit(SAVE_CURSOR, GOTO_INPUT, CLEAR_LINE)
        try:
            n = int(input('Number: '))
        except ValueError:
            continue
        finally:
            emit(UNSAVE_CURSOR)

        #Display some output
        for i in range(n):
            print(i)
            sleep(0.1)

except KeyboardInterrupt:
    #Disable scrolling, but leave cursor below the input row
    emit(set_scroll(0), GOTO_INPUT, b'\n')


 类似资料:
  • 问题内容: 打印列表中元素之前的“ u”?我没有在代码中键入u。 当我运行此命令时,它将打印列表,但其格式如下: 那些“ u”来自列表中每个元素的位置? 问题答案: 我认为您实际上对此感到惊讶的是,打印单个字符串与打印字符串列表的功能不同–无论是否为Unicode,这都是事实: 即使没有,您也有多余的引号,更不用说反斜杠转义了。而且,如果您使用字节字符串而不是字符串尝试相同的操作,那么您仍然会使用

  • 问题内容: 我有一个python脚本test.py: 在linux命令行上执行 返回: 然后执行 哪个返回 如何重定向输出使os.system调用在print语句之前打印? 问题答案: 当您输出到管道时,Python缓冲写入的输出,并在刷新,溢出,关闭后(程序退出时)输出。虽然它将缓冲打印调用,但系统调用输出将直接输出到stdout中,并且其输出将不会被缓冲。这就是为什么您会看到这样的优先级。为了

  • 本文向大家介绍python代码打印100-999之间的回文数示例,包括了python代码打印100-999之间的回文数示例的使用技巧和注意事项,需要的朋友参考一下 打印100-999之间的回文数(即百位和个位的数字相等),并每10个打印一行 结果打印如下: 知识点归纳: 1.while循环基本语法: ------>明确基本结构三要素:开始标志,结束标志,自增数。 开始标志: # i = 100 w

  • 问题内容: 我正在尝试打印,并且该方法在我遇到这种情况之前效果很好。假设我要打印之前,仅在第一页(不是标题)中打印文本“ Report”,最后在文本中打印“ This is the report end”。我想再次澄清一下,我在打印时不需要仅此页眉或页脚出现在第一页的顶部和最后一页的底部。 我怎样才能做到这一点? 问题答案: 要做到这一点的方法之一是一系列适合的一个实例,如图所示这里。 附录:有一

  • 问题内容: 我正在使用Python打开文本文档: 我想将字符串变量的值替换为文本文档。有人可以让我知道怎么做吗? 问题答案: 如果使用上下文管理器,则将自动为你关闭文件 如果你使用的是Python2.6或更高版本,则最好使用 对于python2.7及更高版本,你可以使用代替 在Python3中,该函数有一个可选参数 Python3.6引入了f字符串作为另一种选择

  • 问题内容: 如何在Python中将彩色文本输出到终端? 问题答案: 这在某种程度上取决于您所使用的平台。最常见的方法是打印ANSI转义序列。举一个简单的例子,这是Blender构建脚本中的一些python代码: 要使用这样的代码,您可以执行以下操作 或者,使用Python3.6 +: 这将在包括OS X,Linux和Windows的Unix上运行(前提是您使用ANSICON,或者在Windows