2010-06-29 23 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或任何其他語言可以做到這樣的事情。

我能想到的最接近假的方法是將終端設置爲靜音模式(以便輸入字符不會被回顯)和無緩衝模式(這樣您就可以在鍵入時輸入每個字符,而無需等待行尾),然後逐個讀取每個輸入字符;如果是數字,則打印並附加到一個字符串,否則丟棄它。但我甚至不確定終端是否允許你這樣做。