Python - 循环等待输入

时间:2016-01-26 17:45:16

标签: python while-loop raspberry-pi barcode

我在StackOverflow论坛上浏览过,无法找到适用于我特定问题的解决方案。

我需要编写一些代码,即不断检查用户输入。 我有一个附有条形码扫描仪的Raspberry Pi。我希望我的Python脚本循环,等待我的条形码扫描器发出声音(然后它会在活动窗口中“键入”它,它就像键盘一样)。当条形码扫描器“输入”8位数字时 - 我需要停止Python脚本 - 获取输入并将其保存在变量中。

这是我能想到的唯一的伪代码:

CreateProfileWithIProfAdmin

我非常抱歉我无法提出自己的代码 - 我根本不知道从哪里开始。

编辑:扫描仪“输入”数字。但是不按ENTER键。所以我不知道如何围绕它进行编程。

3 个答案:

答案 0 :(得分:1)

您可以在RaspberryPi上使用此库: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())

答案 1 :(得分:0)

可能会循环,直到输入不等于条形码长度?

barcode = ""
while len(barcode) != 8:
    enter = input("")
    barcode = barcode + enter
print("8 characters were entered.")

我不知道这是不是你想要的。但是,它会检查用户输入和每个输入的数字,它会将它添加到字符串中,直到条形码的长度等于8,然后循环就会中断。

答案 2 :(得分: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 = ''