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

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

问题描述

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

 文本1 
文本2
文本3
请输入:abc

每当打印新文本时,均应在上一个文本之后打印文字和在input()提示符之前。此外,它不应打扰用户输入文本。



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

 文本1 
文本2
文本3
文本4
请输入:abc

是否可以在Python中完成而无需使用任何外部库?



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

解决方案

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



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



此程序首先清除屏幕,然后进入循环,提示用户输入数字 n ,然后打印 range(n),每行一个,时间延迟较小,可以更轻松地查看正在发生的情况。每个范围的输出都从先前的范围开始。如果用户输入非整数,则将重新打印提示。导入了 readline 模块,以便在输入提示下可以进行编辑和历史记录。此模块可能并非在所有平台上都可用。



首先是Python 2版本。

 '''在终端的滚动区域中的固定行上方打印文本以输入

由PM 2Ring编写2016.05.29

Python 2版本
'''

来自__future__ import print_function
来自时间import sleep
import readline

#某些ANSI / VT100终端控制转义序列
CSI ='\x1b ['
CLEAR = CSI +'2J'
CLEAR_LINE = CSI +'2K'
SAVE_CURSOR = CSI +'s'
UNSAVE_CURSOR = CSI +'u'

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

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

#滚动区域的高度
高度= 40

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

发出(清除,set_scroll(高度))

试试:
而True:
#获取输入
发出(SAVE_CURSOR,GOTO_INPUT,CLEAR_LINE)
tr y:
n = int(raw_input('Number:'))
除了ValueError:
继续
最后:
发射(UNSAVE_CURSOR)

#显示范围i中的某些输出
(n):
print(i)
sleep(0.1)

除了KeyboardInterrupt:
#Disable滚动,但将光标留在输入行下方
发出(set_scroll(0),GOTO_INPUT,'\n')






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



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

 '''在终端的滚动区域中在固定行上方打印文本,以输入

由PM 2Ring编写2016.05.29

Python 2/3版本
'''

from __future__ import print_function
import sys
如果sys.version_info>则从导入睡眠

开始导入读取行
。 (3,):
#获取终端机
中的(当前)行数导入shutil
height = shutil.get_terminal_size()。lines-1

stdout_write_bytes = sys.stdout.buffer.write
else:
高度= 40
输入= raw_input
stdout_write_bytes = sys.stdout.write


#某些ANSI / VT100终端控制转义序列
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'%(高度+ 1)

def发射(* args):
stdout_write_bytes(b''。join(args))

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

发出(清除,set_scroll(高度))

试试:
而True:
#获取输入
发出(SAVE_CURSOR,GOTO_INPUT,CLEAR_LINE)
尝试:
n = int(input('Number:'))
除了ValueError:
继续
最后:
发射(UNSAVE_CURSOR)

#显示i在范围(n)中的一些输出

打印(i)
睡眠(0.1)

,键盘中断除外:
#禁用滚动,但将光标置于输入行下方
发射(set_scroll(0),GOTO_INPUT,b'\n')


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

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.

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

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

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

I have already tried using \r, \b 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.

解决方案

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

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.

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.

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


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

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

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