Python - Loop waiting for input

不问归期 提交于 2019-12-11 09:58:35

问题


I have looked around on the StackOverflow forums, unable to find a solution that applies to my specific problem.

I need to write a bit of code, that is continuously checking for user input. I have got a Raspberry Pi with a Barcode Scanner attached to it. I want my Python script to loop, waiting for my Barcode Scanner to bleep something (which will then "type" it in the active window, it's acting like a keyboard). When the barcode scanner 'types' the 8 digit number - I need the Python script to stop - take the input and save it in a variable.

This is the only psuedocode I could come up with:

// 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.

I am terribly sorry I couldn't come up with my own code - I just have no idea where to start.

EDIT: The scanner 'types' the digits out. But does not press ENTER. So I have no idea how I can program around that.


回答1:


You can use this library on a 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 = ""

Or, to shorten everything:

import readchar

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



回答2:


Maybe loop over until the input is not equalled to the barcode length?

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

I don't know if that is what you want. However, it will check for the user input and for each number inputed., it will add it to the string until the length of the barcode is equalled to 8, which then the loop will break.




回答3:


Have you considered evdev?

There is a good example: 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 = ''


来源:https://stackoverflow.com/questions/35020368/python-loop-waiting-for-input

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!