gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 21:46:44 24 4
gpt4 key购买 nike

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

Text 1
Text 2
Text 3
Please enter something: abc

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

因此,在打印“Text 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')

关于python - 在 python 中的 input() 提示符之前打印文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37498704/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com