Python - цикл ожидания ввода
Я осмотрел форумы Stackru, не в силах найти решение, подходящее для моей конкретной проблемы.
Мне нужно написать немного кода, который постоянно проверяет пользовательский ввод. У меня Raspberry Pi с прикрепленным к нему сканером штрих-кода. Я хочу, чтобы мой скрипт на Python зациклился, ожидая, пока мой сканер штрих-кода выдаст что-то (который затем "напечатает" его в активном окне, он будет действовать как клавиатура). Когда сканер штрих-кода "печатает" 8-значное число - мне нужно остановить скрипт Python - возьмите ввод и сохраните его в переменной.
Это единственный psuedocode, который я смог придумать:
// 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 ответа
Вы можете использовать эту библиотеку на 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())
Вы рассматривали evdev?
Вот хороший пример: как я могу получить String с устройства HID в Python с помощью 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 = ''
Может быть, цикл до тех пор, пока вход не будет равен длине штрих-кода?
barcode = ""
while len(barcode) != 8:
enter = input("")
barcode = barcode + enter
print("8 characters were entered.")
Я не знаю, если это то, что вы хотите. Тем не менее, он будет проверять пользовательский ввод и каждое введенное число. Он будет добавлять его в строку до тех пор, пока длина штрих-кода не станет равной 8, что приведет к разрыву цикла.