2010-06-29 311 views
3

有没有办法只接受Python中的数字,比如说使用raw_input()只接受数字作为Python中的输入

我知道我总是可以得到输入并捕获一个ValueError异常,但我有兴趣知道是否有某种方式可以强制提示只接受数字并冻结其他任何输入。

+0

你为什么要这么做? – 2010-06-29 20:38:25

+0

我正在制作一个接受标记作为输入的小脚本。 – user225312 2010-06-29 20:40:12

+0

你也许可以编写自己的类,这样做,我不认为有任何这样的内置功能。 – FrustratedWithFormsDesigner 2010-06-29 20:42:32

回答

2

docs

如何在同一时间得到一个按键?

对于Unix变体:有几个 解决方案。使用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的文件描述符标志和 将它们修改为非阻塞模式。 由于读取标准输入时为空 导致IOError,此错误为 被捕获并被忽略。

使用这个,你可以抓住角色,检查它是否是一个数字,然后显示它。虽然我没有尝试过。

+0

尽管如此,显然我们正在沿着相同的方向思考;-) +1代码。我只是尝试了一下,并做了一些小的改动,它似乎完全按照我的意愿工作。 – 2010-06-29 20:49:19

0

据我所知,没有。我从来没有听说过终端,Python或任何其他语言可以做到这样的事情。

我能想到的最接近假的方法是将终端设置为静音模式(以便输入字符不会被回显)和无缓冲模式(这样您就可以在键入时输入每个字符,而无需等待行尾),然后逐个读取每个输入字符;如果是数字,则打印并附加到一个字符串,否则丢弃它。但我甚至不确定终端是否允许你这样做。