在 python 中的 input() 提示之前打印文本 [英] Print text before input() prompt in python

查看:21
本文介绍了在 python 中的 input() 提示之前打印文本的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

In Python, is it possible to request user input with input() in the console while simultaneously printing out text in the line BEFORE the prompt? It should look something like this:

Text 1
Text 2
Text 3
Please enter something: abc

每当打印新文本时,它应该打印在前一个文本之后和 input() 提示之前.此外,它不应打断用户输入文本.

Whenever new text is printed, it should be printed after the previous text and before the input() prompt. Also, it should not interrupt the user entering the text.

因此,在打印Text 4"后,控制台应如下所示:

Therefore, after printing "Text 4" the console should look like this:

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

是否可以在不使用任何外部库的情况下在 Python 中做到这一点?

Is that possible to do in Python without using any external libraries?

我已经尝试过使用 、 和类似的代码以及线程.我也知道我可能需要让一个线程打印出文本,而另一个线程请求用户输入.

I have already tried using ,  and similar codes as well as threading. I also know that I will probably need to have one thread printing out the text while I have another one requesting the user input.

推荐答案

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

Here's another approach using ANSI/VT100 terminal control escape sequences.

我们告诉终端只滚动终端的上部区域,在那里打印输出数据,这样下部区域,在那里输入提示,保持固定不变.当我们退出程序时(使用Ctrl C),我们需要恢复默认的滚动设置.

We tell the terminal to only scroll the upper region of the terminal, where the output data is printed, so that the lower region, where the input prompt is printed, stays fixed in place. When we exit the program (using Ctrl C) we need to restore the default scrolling settings.

这个程序首先清除屏幕,然后循环提示用户输入一个数字n,然后打印range(n)中的数字,每行一个,有一个小的时间延迟,以便更容易地看到发生了什么.每个范围的输出都来自前一个范围.如果用户输入非整数,则重新打印提示.readline 模块被导入,以便在输入提示下可以进行编辑和历史记录;此模块可能不适用于所有平台.

This program first clears the screen and then sits in a loop prompting the user for a number n and then prints the numbers in range(n), one per line, with a small time delay to make it easier to see what's happening. The output for each range follows on from the previous range. If the user enters a non-integer the prompt is re-printed. The readline module is imported so that editing and history are available at the input prompt; this module may not be available on all platforms.

首先是 Python 2 版本.

First, a Python 2 version.

''' 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, '
')

<小时>

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


And here's a version that runs on Python 2 and Python 3. When run on Python 3 this script calls shutil.get_terminal_size() to set the height of the scrolling region. It is possible to get the terminal size in Python 2, but the code is rather messy, so I opted for a fixed height.

我应该提到,如果在运行时改变终端大小,这个脚本的两个版本都不能很好地应对;正确处理留给读者作为练习.:)

I should mention that both versions of this script don't cope well if the terminal size is changed while they are running; handling that properly is left as an exercise for the reader. :)

''' 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'
')

这篇关于在 python 中的 input() 提示之前打印文本的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆