假设我们使用python3.3和多平台(Linux和WIndow),如果我这样做:
>>> eval(input("enter a percent from 1-100"))
我明白了:
enter a percent from 1-100: (Terminal is Waiting for user prompt)
我希望它显示:
enter a percent from 1-100: (waiting for user prompt) %
如何在括号后面显示%
?
答案 0 :(得分:2)
如果我理解了您的问题,您希望能够编写包含%
符号字符的提示,但将用户的光标放在符号的左侧,如下所示:
Enter a percent from 1-100: %
^ cursor is here
没有通用的解决方案,因为基本的文本IO通常是围绕没有明确定义的交互的输入和输出流。有些方法在某些情况下会起作用,但在其他情况下却不起作用,但我不确定任何可以在任何地方起作用的方法(缺少编写GUI)。
我的一个建议是在提示符中包含ASCII(和unicode)退格字符'\b'
(或'\x08'
)。在某些控制台上,这会将光标移动到每个退格键的左侧一个字符。因此,上面的提示可以通过以下方式生成:
input("Enter a percent from 1-100: %\b\b\b\b\b")
当我从Windows CMD.exe
shell运行Python时,这是有效的,但是当我在IDLE中运行它时('\x08'
字符显示为一个从中间取出一个小圆圈的框) 。虽然它有点粗糙,因为它不能阻止用户输入比%
之前的空格更多的字符(将被输入的第五个字符覆盖)。
另一个可能更强大(但不是跨平台,唉)的解决方案是使用curses
module。我对它建议代码知之甚少,但应该可以让它做你想做的事情(甚至可以控制诸如防止用户输入三个以上的字符,或者将%
符号移动到正确对齐任何长度的值。)
最后一件事:我强烈建议您不要在eval
电话周围使用input
。如果您期望(并要求)整数值,请使用int(input())
。如果你可能得到一个整数,但也可以得到一些其他类型的值,使用多行来测试你得到的:
def get_val():
str_val = input()
try:
return int(str_val) # handle numbers like 1, 23232, etc.
except ValueError:
pass
try:
return float(str_val) # handles 23.5 and -3e-3 (but beware, also "nan" and "inf")
except ValueError:
pass
try:
return make_some_other_value(str_val) # whatever you want
except ValueError:
pass
return str_val # give up and return the string
答案 1 :(得分:2)
这是使用getch包的替代方案。我们不会使用input
,而是使用自己的。{/ p>
import string
import sys
try:
from msvcrt import getch
except ImportError:
from getch import getch
def char_valid(char):
"""Do whatever validation you need here."""
return char in string.ascii_letters or char in string.digits
def char_bkspace(char):
"""Matches backspace and delete."""
return char in ['\x08', '\x7f']
message_pre = 'enter a percent from 1-100'
message_post = '%'
user_input = ''
while True:
sys.stdout.write('\r{0} {1} {2}'.format(message_pre, user_input, message_post))
char = getch()
if char_bkspace(char):
user_input = user_input[:-1]
elif char_valid(char):
user_input += char
else:
break
print('\nyour message was', user_input)
这使用while
在getch
循环中一次为用户输入一个字符。通过使用sys.stdout.write('\r...')
,我们可以避免换行并不断覆盖上一行。
这有一个问题,如果你退格,多个%将是可见的,因为新行不会完全覆盖前一行。这可以通过用空格填充字符串来修复。