2016-01-26 148 views
1

我瀏覽過StackOverflow論壇,無法找到適用於我的特定問題的解決方案。Python - 循環等待輸入

我需要編寫一些代碼,即不斷檢查用戶輸入。 我有一個樹莓派與條碼掃描儀附加到它。我希望我的Python腳本循環,等待我的條碼掃描器發出嗶嗶聲(然後它會在活動窗口中「鍵入」它,它的作用就像鍵盤一樣)。當條形碼掃描器「鍵入」8位數字時 - 我需要Python腳本停止 - 接受輸入並將其保存在變量中。

這是唯一的僞碼我能想出:

// Create variable, store an empty string 

// Create a while loop 
// Within the while loop, continuously check for input. 
// If input has been found, stop the loop and save the input in a variable. 

我非常抱歉我不能拿出自己的代碼 - 我只是不知道從哪裏開始。

編輯:掃描儀'鍵入'數字了。但不按ENTER鍵。所以我不知道我該如何編程。

+3

也許你應該從這裏開始:https://docs.python.org/2/tutorial/,如果你不能讓過去的「創建變量」階段。 – timgeb

+0

第8個字母后是否發送Newline字符? – Mijago

+0

@Mijago不怕。它只是輸入8位數字,就是這樣。 – Cake

回答

1

您可以在樹莓派使用這個庫:https://pypi.python.org/pypi/readchar

import readchar 


inputStr = "" 

while len(inputStr) != 8: 
    inputStr += str(readchar.readchar()) 

# Quote: "Save it in variable" 

variable = inputStr 

# Clean 
inputStr = "" 

或者,縮短了一切:

import readchar 

variable = "" 
while len(variable) != 8: 
    variable += str(readchar.readchar()) 
+0

Readchar絕對似乎是要走的路。但是,當我嘗試你的代碼。我得到一個UnsupportedOperation:fileno錯誤。 它說有什麼問題 'variable + = readchar.readchar()' – Cake

+0

我添加了一個強制轉換爲字符串。請試試這個,也許這是錯誤。 如果不是,請嘗試 變量=變量+ str(readchar.readchar()) – Mijago

+0

同樣的問題恐怕.... – Cake

0

也許循環直到輸入不等於條碼的長度?我不知道這是不是你想要的。但是,它將檢查用戶輸入和每個輸入的數字,它會將它添加到字符串中,直到條形碼的長度等於8,然後循環將會中斷。

+0

問題在於,條形碼掃描器只能輸入數字。它不按ENTER鍵。 – Cake

+0

您可以查看[這篇文章](http://stackoverflow.com/questions/983354/how-do-i-make-python-to-wait-for-a-pressed-key)它顯示了一些方法來做到這一點。 – Bink

0

你有沒有考慮了evdev?

有一個很好的例子:How can I get a String from HID device in Python with evdev?

import evdev 
from evdev import InputDevice, categorize, ecodes 

# Change /dev/input/event1 to the eventX, where X is your scanner's address 
dev = InputDevice('/dev/input/event1') 


scancodes = { 
    # Scancode: ASCIICode 
    0: None, 1: u'ESC', 2: u'1', 3: u'2', 4: u'3', 5: u'4', 6: u'5', 7: u'6', 8: u'7', 9: u'8', 
    10: u'9', 11: u'0', 12: u'-', 13: u'=', 14: u'BKSP', 15: u'TAB', 16: u'q', 17: u'w', 18: u'e', 19: u'r', 
    20: u't', 21: u'y', 22: u'u', 23: u'i', 24: u'o', 25: u'p', 26: u'[', 27: u']', 28: u'CRLF', 29: u'LCTRL', 
    30: u'a', 31: u's', 32: u'd', 33: u'f', 34: u'g', 35: u'h', 36: u'j', 37: u'k', 38: u'l', 39: u';', 
    40: u'"', 41: u'`', 42: u'LSHFT', 43: u'\\', 44: u'z', 45: u'x', 46: u'c', 47: u'v', 48: u'b', 49: u'n', 
    50: u'm', 51: u',', 52: u'.', 53: u'/', 54: u'RSHFT', 56: u'LALT', 100: u'RALT' 
} 

capscodes = { 
    0: None, 1: u'ESC', 2: u'!', 3: u'@', 4: u'#', 5: u'$', 6: u'%', 7: u'^', 8: u'&', 9: u'*', 
    10: u'(', 11: u')', 12: u'_', 13: u'+', 14: u'BKSP', 15: u'TAB', 16: u'Q', 17: u'W', 18: u'E', 19: u'R', 
    20: u'T', 21: u'Y', 22: u'U', 23: u'I', 24: u'O', 25: u'P', 26: u'{', 27: u'}', 28: u'CRLF', 29: u'LCTRL', 
    30: u'A', 31: u'S', 32: u'D', 33: u'F', 34: u'G', 35: u'H', 36: u'J', 37: u'K', 38: u'L', 39: u':', 
    40: u'\'', 41: u'~', 42: u'LSHFT', 43: u'|', 44: u'Z', 45: u'X', 46: u'C', 47: u'V', 48: u'B', 49: u'N', 
    50: u'M', 51: u'<', 52: u'>', 53: u'?', 54: u'RSHFT', 56: u'LALT', , 57: u' ' 100: u'RALT' 
} 
#setup vars 
x = '' 
caps = False 

#grab grants exclusive access to device 
dev.grab() 

#loop 
for event in dev.read_loop(): 
    if event.type == ecodes.EV_KEY: 
     data = categorize(event) # Save the event temporarily to introspect it 
     if data.scancode == 42: 
      if data.keystate == 1: 
       caps = True 
      if data.keystate == 0: 
       caps = False 
     if data.keystate == 1: # Down events only 
      if caps: 
       key_lookup = u'{}'.format(capscodes.get(data.scancode)) or u'UNKNOWN:[{}]'.format(data.scancode) # Lookup or return UNKNOWN:XX 
      else: 
       key_lookup = u'{}'.format(scancodes.get(data.scancode)) or u'UNKNOWN:[{}]'.format(data.scancode) # Lookup or return UNKNOWN:XX 
      if (data.scancode != 42) and (data.scancode != 28): 
       x += key_lookup # Print it all out! 
      if(data.scancode == 28): 
       print x 
       x = ''