2024-06-11 14:04:15 发布
网友
假设我们使用的是python3.3和多平台(Linux和windows),如果我执行以下操作:
>>> eval(input("enter a percent from 1-100"))
我得到:
我希望它显示:
enter a percent from 1-100: (waiting for user prompt) %
如何在括号后显示%?在
%
这里有一个使用getch包的替代方案。我们不使用input,而是使用我们自己的。在
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...'),我们可以避免换行并不断地覆盖上一行。在
getch
while
sys.stdout.write('\r...')
这有一个问题,如果您退格,多个%将可见,因为新行没有完全覆盖上一行。这可以通过在字符串中填充空格来解决。在
如果我理解您的问题,您希望能够编写一个包含%符号字符的提示,但将用户的光标放在符号的左侧,如下所示:
Enter a percent from 1-100: % ^ cursor is here
没有一个通用的解决方案来解决这个问题,因为基本文本IO通常是面向没有良好定义的交互的输入和输出流的。有一些方法在某些情况下是有效的,但在其他情况下却不行,但我不确定任何方法在任何地方都能奏效(除了编写GUI)。在
我的一个建议是在提示中包含ASCII(和unicode)退格字符'\b'(或'\x08')。在某些控制台上,这将使光标向左移动一个字符。因此,上面的提示可以通过以下方式生成:
'\b'
'\x08'
当我从windows的CMD.exeshell运行Python时,这是有效的,但当我在IDLE中运行它时,'\x08'字符显示为一个方框,中间有一个小圆圈。但是这有点粗糙,因为它不能阻止用户输入比%前面的空格更多的字符(输入的第五个字符将覆盖它)。在
CMD.exe
另一个可能更健壮(但不是跨平台的)的解决方案是使用^{} module。我对它的了解还不足以推荐代码,但应该可以让它做你想做的事情(甚至可以控制一些事情,比如防止用户输入超过三个字符,或者移动%符号以与任何长度的值正确对齐)。在
最后一件事:我强烈建议您不要在input调用中使用eval。如果您希望(并且需要)一个整数值,请使用int(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
这里有一个使用getch包的替代方案。我们不使用
input
,而是使用我们自己的。在这将使用
getch
在while
循环中一次获取一个字符的用户输入。通过使用sys.stdout.write('\r...')
,我们可以避免换行并不断地覆盖上一行。在这有一个问题,如果您退格,多个%将可见,因为新行没有完全覆盖上一行。这可以通过在字符串中填充空格来解决。在
如果我理解您的问题,您希望能够编写一个包含
%
符号字符的提示,但将用户的光标放在符号的左侧,如下所示:没有一个通用的解决方案来解决这个问题,因为基本文本IO通常是面向没有良好定义的交互的输入和输出流的。有一些方法在某些情况下是有效的,但在其他情况下却不行,但我不确定任何方法在任何地方都能奏效(除了编写GUI)。在
我的一个建议是在提示中包含ASCII(和unicode)退格字符
^{pr2}$'\b'
(或'\x08'
)。在某些控制台上,这将使光标向左移动一个字符。因此,上面的提示可以通过以下方式生成:当我从windows的
CMD.exe
shell运行Python时,这是有效的,但当我在IDLE中运行它时,'\x08'
字符显示为一个方框,中间有一个小圆圈。但是这有点粗糙,因为它不能阻止用户输入比%
前面的空格更多的字符(输入的第五个字符将覆盖它)。在另一个可能更健壮(但不是跨平台的)的解决方案是使用^{} module 。我对它的了解还不足以推荐代码,但应该可以让它做你想做的事情(甚至可以控制一些事情,比如防止用户输入超过三个字符,或者移动
%
符号以与任何长度的值正确对齐)。在最后一件事:我强烈建议您不要在
input
调用中使用eval
。如果您希望(并且需要)一个整数值,请使用int(input())
。如果您可能得到一个整数,但也可能得到其他类型的值,请使用多行代码来测试您得到的结果:相关问题 更多 >
编程相关推荐