2013-10-24 167 views
3

假设我们是在python3.3和多平台(Linux和窗口),我要是以下:输入(...)后提示%?

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

这根本无法完成。 – arshajii

+0

这是在Windows还是Linux?你可以看看windows上的'console'模块。可以办到。 – simonzack

+0

我在Linux上编写这个脚本。 – user105951

回答

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") 

这时候我从窗户CMD.exe shell中运行Python的工作,而不是当我IDLE中运行它('\x08'字符显示为一个框,一个小圆圈:那么,可以通过以下方式产生上面的提示从中间取出)。这有点粗糙,因为它不能阻止用户输入比%(将被输入的第五个字符覆盖)之前的空格多的字符。

另一种可能更健壮(但不是跨平台,唉)的解决方案是使用curses 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 
+1

哦,我想'\ b'字符会删除百分号字符? – justhalf

+1

@justhalf:它取决于终端的功能,但我不认为当退格字符被打印时,大多数系统都会删除它。如果他们工作(而不是打印转义代码或其他东西),他们只是备份光标位置,这将允许您覆盖的东西,如果你想。 (例如spinner:'while True:for c in'/ - \ |':print(c,end =“\ b”,flush = True); sleep(.25)')。 – Blckknght

2

下面是一个使用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) 

此使用getch获取用户输入的一个字符在一个while循环的时间。通过使用sys.stdout.write('\r...'),我们可以避免换行并不断覆盖前一行。

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