输入(...)提示后显示%?

时间:2013-10-24 23:08:55

标签: python python-3.x

假设我们使用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)  %

如何在括号后面显示%

2 个答案:

答案 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)

这使用whilegetch循环中一次为用户输入一个字符。通过使用sys.stdout.write('\r...'),我们可以避免换行并不断覆盖上一行。

这有一个问题,如果你退格,多个%将是可见的,因为新行不会完全覆盖前一行。这可以通过用空格填充字符串来修复。