python 光标位置输入文字_关于cmd:在python中的input()提示符之前打印文本

在Python中,是否可以通过控制台中的input()请求用户输入,同时在提示之前的行中打印出文本?

它看起来应该像这样:

1

2

3

4Text 1

Text 2

Text 3

Please enter something: abc

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

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

1

2

3

4

5Text 1

Text 2

Text 3

Text 4

Please enter something: abc

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

我已经尝试使用 r, b和类似的代码以及线程。

我也知道我可能需要一个线程来打印文本,而另一个线程则需要用户输入。

您认为不可能吗?

什么是insert()?

糟糕,我的意思是input()。 抱歉!

什么操作系统?

主要是Windows,但Id希望它与平台无关

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

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

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

首先是Python 2版本。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51''' 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中获得终端大小,但是代码相当混乱,因此我选择了固定高度。

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

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

')

在Linux上,您可以这样操作:

1

2

3

4

5

6

7

8

9

10

11

12

13#!/usr/bin/python

CURSOR_UP_ONE = '\x1b[1A'

ERASE_LINE = '\x1b[2K'

print('Text 1

Text 2

Text 3')

inp = ''

while inp != 'END':

inp = raw_input('Please enter something:')

print(CURSOR_UP_ONE + ERASE_LINE + inp)

关键是每次将光标向上移动一行并擦除行Please enter something:。然后,您可以在其位置上写输入,并在需要时再次写关于输入的通知。

特殊字符串:

CURSOR_UP_ONE和ERASE_LINE是具有特殊含义的字符串。如果您可以在这里找到那些终端逃逸控制序列的完整列表,请访问这里。

在Windows上使用ANSI终端转义控制序列:

在某种程度上,也可以在Windows上使用此序列。例如。这些问题涉及这个主题:

https://superuser.com/questions/413073/windows-console-with-ansi-colors-handling/1050078#1050078

如何使Win32控制台识别ANSI / VT100转义序列?

该脚本的工作流程

bOnId.png

Gzfnz.png

SMbKO.png

ih8O4.png

您可以通过执行以下操作来模仿您想要的内容:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31import os

def clear(): os.system('cls')

screen =""

prompt =""

def printToScreen(s):

global screen, prompt

clear()

screen += (s + '

')

print(screen)

print(prompt)

def promptToScreen(p):

global screen, prompt

clear()

print(screen)

s = input(p)

prompt = p + s

return s

#test:

while True:

s = promptToScreen("Enter anything -- or press 'Enter' to quit:")

if len(s) > 0:

printToScreen(s)

else:

break

以下两个屏幕截图显示了其工作原理:

gNMKY.gif

然后:

cBrkC.gif

这是Windows解决方案。在其他操作系统中-使用其命令清除屏幕。您可以通过编写clear()使它更易于移植,以便根据操作系统发出不同的命令。以上大部分是概念证明。关键思想是维护一个代表您希望终端外观的字符串,然后编写自己的打印功能,该功能会修改该字符串,清除终端,然后将该屏幕打印至命令提示符。除非您做一些奇怪的事情,否则开销可以忽略不计,并且清除/更新对于用户是不可见的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值