在输入(…)提示后显示%?

2024-06-11 14:04:15 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我们使用的是python3.3和多平台(Linux和windows),如果我执行以下操作:

>>> eval(input("enter a percent from 1-100"))

我得到:

^{pr2}$

我希望它显示:

enter a percent from 1-100: (waiting for user prompt)  %

如何在括号后显示%?在


Tags: fromforinputlinuxwindowseval平台prompt
1条回答
网友
1楼 · 发布于 2024-06-11 14:04:15

这里有一个使用getch包的替代方案。我们不使用input,而是使用我们自己的。在

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)

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

这有一个问题,如果您退格,多个%将可见,因为新行没有完全覆盖上一行。这可以通过在字符串中填充空格来解决。在

网友
2楼 · 发布于 2024-06-11 14:04:15

如果我理解您的问题,您希望能够编写一个包含%符号字符的提示,但将用户的光标放在符号的左侧,如下所示:

Enter a percent from 1-100:     %
                            ^ cursor is here

没有一个通用的解决方案来解决这个问题,因为基本文本IO通常是面向没有良好定义的交互的输入和输出流的。有一些方法在某些情况下是有效的,但在其他情况下却不行,但我不确定任何方法在任何地方都能奏效(除了编写GUI)。在

我的一个建议是在提示中包含ASCII(和unicode)退格字符'\b'(或'\x08')。在某些控制台上,这将使光标向左移动一个字符。因此,上面的提示可以通过以下方式生成:

^{pr2}$

当我从windows的CMD.exeshell运行Python时,这是有效的,但当我在IDLE中运行它时,'\x08'字符显示为一个方框,中间有一个小圆圈。但是这有点粗糙,因为它不能阻止用户输入比%前面的空格更多的字符(输入的第五个字符将覆盖它)。在

另一个可能更健壮(但不是跨平台的)的解决方案是使用^{} module。我对它的了解还不足以推荐代码,但应该可以让它做你想做的事情(甚至可以控制一些事情,比如防止用户输入超过三个字符,或者移动%符号以与任何长度的值正确对齐)。在

最后一件事:我强烈建议您不要在input调用中使用eval。如果您希望(并且需要)一个整数值,请使用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

相关问题 更多 >