有没有办法只接受Python中的数字,比如使用raw_input()
?
我知道我总是可以得到输入并捕获ValueError
异常,但我有兴趣知道是否有某种程度上我可以强制提示只接受数字并冻结任何其他输入。
答案 0 :(得分:2)
来自docs:
我如何一次获得一次按键?
对于Unix变种:有几种 解决方案。这很简单 这使用curses,但curses是一个 相当大的模块学习。这是一个 没有诅咒的解决方案:
import termios, fcntl, sys, os
fd = sys.stdin.fileno()
oldterm = termios.tcgetattr(fd)
newattr = termios.tcgetattr(fd)
newattr[3] = newattr[3] & ~termios.ICANON & ~termios.ECHO
termios.tcsetattr(fd, termios.TCSANOW, newattr)
oldflags = fcntl.fcntl(fd, fcntl.F_GETFL)
fcntl.fcntl(fd, fcntl.F_SETFL, oldflags | os.O_NONBLOCK)
try:
while 1:
try:
c = sys.stdin.read(1)
print "Got character", `c`
except IOError: pass
finally:
termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm)
fcntl.fcntl(fd, fcntl.F_SETFL, oldflags)
你需要termios和fcntl 任何这个工作的模块,和 我只是在Linux上试过它,尽管它 应该在别处工作在这段代码中, 字符被读取和打印一个 一段时间。
termios.tcsetattr()关闭stdin的 回显和禁用规范模式。 fcntl.fnctl()用于获取 stdin的文件描述符标志和 修改它们以进行非阻塞模式。 因为在空的时候读stdin 导致IOError,此错误是 抓住并忽略了。
使用此功能,您可以获取角色,检查它是否为数字,然后显示它。不过,我自己也没试过。
答案 1 :(得分:0)
据我所知,没有。我从来没有听说过使用Python或任何其他语言的终端可以做到这一点。
我能想到的最接近假的方法是将终端置于静默模式(以便输入字符不被回显)和无缓冲模式(这样你就可以在输入时输入每个字符,而无需等待行尾),然后逐个读取每个输入字符;如果它是一个数字,打印它并将其附加到字符串,否则丢弃它。但我甚至不确定终端是否会允许你这样做。