- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个模块可以捕获条形码扫描仪的所有读取数据。我的问题是我无法正确关闭它。发送 KeyboardInterrupt 或 SystemExit 信号后,仅当我扫描条形码时才会停止。
我尝试将此方法添加到 BarcodeScanner 类中,但仍然不起作用:
def interrupt(self):
"""Envoi la demande d'arrêt."""
super(BarcodeScanner, self).interrupt()
self.device.write(ecodes.EV_KEY, ecodes.KEY_ESC, 0)
self.device.write(ecodes.EV_SYN, ecodes.SYN_REPORT, 0)
我怎样才能做到这一点?
可中断.py
#!/usr/bin/env python3
# -*-coding:Utf-8 -*
class Interruptable:
"""Classe intégrant une boucle sans fin pouvant être stoppée proprement."""
interruptables = []
def __init__(self):
"""Crée un objet interruptible."""
self._interrupted = False
Interruptable.interruptables.append(self)
def interrupt(self):
"""Envoi la demande d'arrêt."""
self._interrupted = True
def reset(self):
"""Permet le redémarrage d'un service."""
self._interrupted = False
def interrupted(self):
"""Verifie si la demande d'arrêt à déjà été envoyée."""
return self._interrupted
barcode_scanner.py
#!/usr/bin/env python3
# -*-coding:Utf-8 -*
from evdev import InputDevice, ecodes, list_devices, categorize
import signal, sys
import threading
from time import sleep
from tymsoft.interruptable import Interruptable
class BarcodeScanner(Interruptable):
"""TODO"""
def __init__(self, device_name='Bar Code', layout='AZERTY_FR'):
self.modifiers = {
# 0: None, 29: u'LCTRL', 42: u'LSHFT', 54: u'RSHFT', 56: u'LALT', 97:u'RCTRL', 100: u'RALT'
0: 0, 29: 1, 42: 2, 54: 3, 56: 4, 97: 5, 100: 6
}
self.layouts = {
'AZERTY_FR': {
# [NORMAL, LCTRL, LSHFT, RSHFT, LALT, RCTRL, RALT]
2: [u'&', u'', u'1', u'1', u'', u'', u''],
3: [u'é', u'', u'2', u'2', u'', u'', u'~'],
4: [u'"', u'', u'3', u'3', u'', u'', u'#'],
5: [u'\'', u'', u'4', u'4', u'', u'', u'{'],
6: [u'(', u'', u'5', u'5', u'', u'', u'['],
7: [u'-', u'', u'6', u'6', u'', u'', u'|'],
8: [u'è', u'', u'7', u'7', u'', u'', u'`'],
9: [u'_', u'', u'8', u'8', u'', u'', u'\\'],
10: [u'ç', u'', u'9', u'9', u'', u'', u'^'],
11: [u'à', u'', u'0', u'0', u'', u'', u'@'],
12: [u')', u'', u'°', u'°', u'', u'', u']'],
13: [u'=', u'', u'+', u'+', u'', u'', u'}'],
15: [u'\t', u'', u'', u'', u'', u'', u''],
16: [u'a', u'', u'A', u'A', u'', u'', u''],
17: [u'z', u'', u'Z', u'Z', u'', u'', u''],
18: [u'e', u'', u'E', u'E', u'', u'', u'€'],
19: [u'r', u'', u'R', u'R', u'', u'', u''],
20: [u't', u'', u'T', u'T', u'', u'', u''],
21: [u'y', u'', u'Y', u'Y', u'', u'', u''],
22: [u'u', u'', u'U', u'U', u'', u'', u''],
23: [u'i', u'', u'I', u'I', u'', u'', u''],
24: [u'o', u'', u'O', u'O', u'', u'', u''],
25: [u'p', u'', u'P', u'P', u'', u'', u''],
26: [u'^', u'', u'¨', u'¨', u'', u'', u''],
27: [u'$', u'', u'£', u'£', u'', u'', u'¤'],
28: [u'\n', u'', u'', u'', u'', u'', u''],
30: [u'q', u'', u'Q', u'Q', u'', u'', u''],
31: [u's', u'', u'S', u'S', u'', u'', u''],
32: [u'd', u'', u'D', u'D', u'', u'', u''],
33: [u'f', u'', u'F', u'F', u'', u'', u''],
34: [u'g', u'', u'G', u'G', u'', u'', u''],
35: [u'h', u'', u'H', u'H', u'', u'', u''],
36: [u'j', u'', u'J', u'J', u'', u'', u''],
37: [u'k', u'', u'K', u'K', u'', u'', u''],
38: [u'l', u'', u'L', u'L', u'', u'', u''],
39: [u'm', u'\n', u'M', u'M', u'', u'', u''],
40: [u'ù', u'', u'%', u'%', u'', u'', u''],
41: [u'²', u'', u'', u'', u'', u'', u''],
43: [u'*', u'', u'µ', u'µ', u'', u'', u''],
44: [u'w', u'', u'W', u'W', u'', u'', u''],
45: [u'x', u'', u'X', u'X', u'', u'', u''],
46: [u'c', u'', u'C', u'C', u'', u'', u''],
47: [u'v', u'', u'V', u'V', u'', u'', u''],
48: [u'b', u'', u'B', u'B', u'', u'', u''],
49: [u'n', u'', u'N', u'N', u'', u'', u''],
50: [u',', u'', u'?', u'?', u'', u'', u''],
51: [u';', u'', u'.', u'.', u'', u'', u''],
52: [u':', u'', u'/', u'/', u'', u'', u''],
53: [u'!', u'', u'§', u'§', u'', u'', u''],
57: [u' ', u'', u' ', u' ', u'', u'', u''],
86: [u'<', u'', u'>', u'>', u'', u'', u''],
96: [u'\n', u'', u'', u'', u'', u'', u'']
},
'QWERTY_US': {
# [NORMAL, LCTRL, LSHFT, RSHFT, LALT, RCTRL, RALT]
2: [u'1', u'', u'!', u'!', u'', u'', u''],
3: [u'2', u'', u'@', u'@', u'', u'', u''],
4: [u'3', u'', u'#', u'#', u'', u'', u''],
5: [u'4', u'', u'$', u'$', u'', u'', u''],
6: [u'5', u'', u'%', u'%', u'', u'', u''],
7: [u'6', u'', u'^', u'^', u'', u'', u''],
8: [u'7', u'', u'&', u'&', u'', u'', u''],
9: [u'8', u'', u'*', u'*', u'', u'', u''],
10: [u'9', u'', u'(', u'(', u'', u'', u''],
11: [u'0', u'', u')', u')', u'', u'', u''],
12: [u'-', u'', u'_', u'_', u'', u'', u''],
13: [u'=', u'', u'+', u'+', u'', u'', u''],
15: [u'\t', u'', u'', u'', u'', u'', u''],
16: [u'q', u'', u'Q', u'Q', u'', u'', u''],
17: [u'w', u'', u'W', u'W', u'', u'', u''],
18: [u'e', u'', u'E', u'E', u'', u'', u''],
19: [u'r', u'', u'R', u'R', u'', u'', u''],
20: [u't', u'', u'T', u'T', u'', u'', u''],
21: [u'y', u'', u'Y', u'Y', u'', u'', u''],
22: [u'u', u'', u'U', u'U', u'', u'', u''],
23: [u'i', u'', u'I', u'I', u'', u'', u''],
24: [u'o', u'', u'O', u'O', u'', u'', u''],
25: [u'p', u'', u'P', u'P', u'', u'', u''],
26: [u'[', u'', u'{', u'{', u'', u'', u''],
27: [u']', u'', u'}', u'}', u'', u'', u''],
28: [u'\n', u'', u'', u'', u'', u'', u''],
30: [u'a', u'', u'A', u'A', u'', u'', u''],
31: [u's', u'', u'S', u'S', u'', u'', u''],
32: [u'd', u'', u'D', u'D', u'', u'', u''],
33: [u'f', u'', u'F', u'F', u'', u'', u''],
34: [u'g', u'', u'G', u'G', u'', u'', u''],
35: [u'h', u'', u'H', u'H', u'', u'', u''],
36: [u'j', u'', u'J', u'J', u'', u'', u''],
37: [u'k', u'', u'K', u'K', u'', u'', u''],
38: [u'l', u'', u'L', u'L', u'', u'', u''],
39: [u';', u'', u':', u':', u'', u'', u''],
40: [u'\'', u'', u'"', u'"', u'', u'', u''],
41: [u'`', u'', u'~', u'~', u'', u'', u''],
43: [u'\\', u'', u'|', u'|', u'', u'', u''],
44: [u'z', u'', u'Z', u'Z', u'', u'', u''],
45: [u'x', u'', u'X', u'X', u'', u'', u''],
46: [u'c', u'', u'C', u'C', u'', u'', u''],
47: [u'v', u'', u'V', u'V', u'', u'', u''],
48: [u'b', u'', u'B', u'B', u'', u'', u''],
49: [u'n', u'', u'N', u'N', u'', u'', u''],
50: [u'm', u'\n', u'M', u'M', u'', u'', u''],
51: [u',', u'', u'<', u'<', u'', u'', u''],
52: [u'.', u'', u'>', u'>', u'', u'', u''],
53: [u'/', u'', u'?', u'?', u'', u'', u''],
57: [u' ', u'', u' ', u' ', u'', u'', u''],
96: [u'\n', u'', u'', u'', u'', u'', u'']
}
}
self.eol = [(0, 28), (0, 96), (29, 39)]
self.layout = layout
self.device = None
devices = map(InputDevice, list_devices())
for device in devices:
if device_name in device.name:
self.device = InputDevice(device.fn)
print('Lecteur de codes-barres : ' + device.name)
break
self._listeners = []
Interruptable.__init__(self)
self.device.grab()
def start_capture(self):
"""TODO"""
def run():
barcode = ''
modifier = 0
keycode = 0
for event in self.device.read_loop():
if not self.interrupted():
if event.type == ecodes.EV_KEY:
data = categorize(event)
if data.keystate == 1:
if data.scancode in self.modifiers:
modifier = data.scancode
elif data.scancode in self.layouts[self.layout]:
keycode = data.scancode
elif event.type == ecodes.EV_SYN:
if (modifier, keycode) in self.eol:
if len(barcode) > 0:
for listener in self._listeners:
listener(barcode)
barcode = ''
elif keycode != 0:
barcode += self.layouts[self.layout][keycode][self.modifiers[modifier]]
modifier = 0
keycode = 0
else:
self.device.ungrab()
break
thread = threading.Thread(target=run, name='barcode_scanner')
thread.start()
def register_listener(self, callback):
self._listeners.append(callback)
最佳答案
我通过用 select()+read() 循环替换 read_loop() 方法解决了这个问题。通过这种方式,我可以在选择上设置超时。
#!/usr/bin/env python3
# -*-coding:Utf-8 -*
from evdev import InputDevice, ecodes, list_devices, categorize
from select import select
import signal, sys
import threading
from time import sleep
from tymsoft.interruptable import Interruptable
class BarcodeScanner(Interruptable):
"""TODO"""
def __init__(self, device_name='Bar Code', layout='AZERTY_FR'):
self.modifiers = {
# 0: None, 29: u'LCTRL', 42: u'LSHFT', 54: u'RSHFT', 56: u'LALT', 97:u'RCTRL', 100: u'RALT'
0: 0, 29: 1, 42: 2, 54: 3, 56: 4, 97: 5, 100: 6
}
self.layouts = {
'AZERTY_FR': {
# [NORMAL, LCTRL, LSHFT, RSHFT, LALT, RCTRL, RALT]
2: [u'&', u'', u'1', u'1', u'', u'', u''],
3: [u'é', u'', u'2', u'2', u'', u'', u'~'],
4: [u'"', u'', u'3', u'3', u'', u'', u'#'],
5: [u'\'', u'', u'4', u'4', u'', u'', u'{'],
6: [u'(', u'', u'5', u'5', u'', u'', u'['],
7: [u'-', u'', u'6', u'6', u'', u'', u'|'],
8: [u'è', u'', u'7', u'7', u'', u'', u'`'],
9: [u'_', u'', u'8', u'8', u'', u'', u'\\'],
10: [u'ç', u'', u'9', u'9', u'', u'', u'^'],
11: [u'à', u'', u'0', u'0', u'', u'', u'@'],
12: [u')', u'', u'°', u'°', u'', u'', u']'],
13: [u'=', u'', u'+', u'+', u'', u'', u'}'],
15: [u'\t', u'', u'', u'', u'', u'', u''],
16: [u'a', u'', u'A', u'A', u'', u'', u''],
17: [u'z', u'', u'Z', u'Z', u'', u'', u''],
18: [u'e', u'', u'E', u'E', u'', u'', u'€'],
19: [u'r', u'', u'R', u'R', u'', u'', u''],
20: [u't', u'', u'T', u'T', u'', u'', u''],
21: [u'y', u'', u'Y', u'Y', u'', u'', u''],
22: [u'u', u'', u'U', u'U', u'', u'', u''],
23: [u'i', u'', u'I', u'I', u'', u'', u''],
24: [u'o', u'', u'O', u'O', u'', u'', u''],
25: [u'p', u'', u'P', u'P', u'', u'', u''],
26: [u'^', u'', u'¨', u'¨', u'', u'', u''],
27: [u'$', u'', u'£', u'£', u'', u'', u'¤'],
28: [u'\n', u'', u'', u'', u'', u'', u''],
30: [u'q', u'', u'Q', u'Q', u'', u'', u''],
31: [u's', u'', u'S', u'S', u'', u'', u''],
32: [u'd', u'', u'D', u'D', u'', u'', u''],
33: [u'f', u'', u'F', u'F', u'', u'', u''],
34: [u'g', u'', u'G', u'G', u'', u'', u''],
35: [u'h', u'', u'H', u'H', u'', u'', u''],
36: [u'j', u'', u'J', u'J', u'', u'', u''],
37: [u'k', u'', u'K', u'K', u'', u'', u''],
38: [u'l', u'', u'L', u'L', u'', u'', u''],
39: [u'm', u'\n', u'M', u'M', u'', u'', u''],
40: [u'ù', u'', u'%', u'%', u'', u'', u''],
41: [u'²', u'', u'', u'', u'', u'', u''],
43: [u'*', u'', u'µ', u'µ', u'', u'', u''],
44: [u'w', u'', u'W', u'W', u'', u'', u''],
45: [u'x', u'', u'X', u'X', u'', u'', u''],
46: [u'c', u'', u'C', u'C', u'', u'', u''],
47: [u'v', u'', u'V', u'V', u'', u'', u''],
48: [u'b', u'', u'B', u'B', u'', u'', u''],
49: [u'n', u'', u'N', u'N', u'', u'', u''],
50: [u',', u'', u'?', u'?', u'', u'', u''],
51: [u';', u'', u'.', u'.', u'', u'', u''],
52: [u':', u'', u'/', u'/', u'', u'', u''],
53: [u'!', u'', u'§', u'§', u'', u'', u''],
57: [u' ', u'', u' ', u' ', u'', u'', u''],
86: [u'<', u'', u'>', u'>', u'', u'', u''],
96: [u'\n', u'', u'', u'', u'', u'', u'']
},
'QWERTY_US': {
# [NORMAL, LCTRL, LSHFT, RSHFT, LALT, RCTRL, RALT]
2: [u'1', u'', u'!', u'!', u'', u'', u''],
3: [u'2', u'', u'@', u'@', u'', u'', u''],
4: [u'3', u'', u'#', u'#', u'', u'', u''],
5: [u'4', u'', u'$', u'$', u'', u'', u''],
6: [u'5', u'', u'%', u'%', u'', u'', u''],
7: [u'6', u'', u'^', u'^', u'', u'', u''],
8: [u'7', u'', u'&', u'&', u'', u'', u''],
9: [u'8', u'', u'*', u'*', u'', u'', u''],
10: [u'9', u'', u'(', u'(', u'', u'', u''],
11: [u'0', u'', u')', u')', u'', u'', u''],
12: [u'-', u'', u'_', u'_', u'', u'', u''],
13: [u'=', u'', u'+', u'+', u'', u'', u''],
15: [u'\t', u'', u'', u'', u'', u'', u''],
16: [u'q', u'', u'Q', u'Q', u'', u'', u''],
17: [u'w', u'', u'W', u'W', u'', u'', u''],
18: [u'e', u'', u'E', u'E', u'', u'', u''],
19: [u'r', u'', u'R', u'R', u'', u'', u''],
20: [u't', u'', u'T', u'T', u'', u'', u''],
21: [u'y', u'', u'Y', u'Y', u'', u'', u''],
22: [u'u', u'', u'U', u'U', u'', u'', u''],
23: [u'i', u'', u'I', u'I', u'', u'', u''],
24: [u'o', u'', u'O', u'O', u'', u'', u''],
25: [u'p', u'', u'P', u'P', u'', u'', u''],
26: [u'[', u'', u'{', u'{', u'', u'', u''],
27: [u']', u'', u'}', u'}', u'', u'', u''],
28: [u'\n', u'', u'', u'', u'', u'', u''],
30: [u'a', u'', u'A', u'A', u'', u'', u''],
31: [u's', u'', u'S', u'S', u'', u'', u''],
32: [u'd', u'', u'D', u'D', u'', u'', u''],
33: [u'f', u'', u'F', u'F', u'', u'', u''],
34: [u'g', u'', u'G', u'G', u'', u'', u''],
35: [u'h', u'', u'H', u'H', u'', u'', u''],
36: [u'j', u'', u'J', u'J', u'', u'', u''],
37: [u'k', u'', u'K', u'K', u'', u'', u''],
38: [u'l', u'', u'L', u'L', u'', u'', u''],
39: [u';', u'', u':', u':', u'', u'', u''],
40: [u'\'', u'', u'"', u'"', u'', u'', u''],
41: [u'`', u'', u'~', u'~', u'', u'', u''],
43: [u'\\', u'', u'|', u'|', u'', u'', u''],
44: [u'z', u'', u'Z', u'Z', u'', u'', u''],
45: [u'x', u'', u'X', u'X', u'', u'', u''],
46: [u'c', u'', u'C', u'C', u'', u'', u''],
47: [u'v', u'', u'V', u'V', u'', u'', u''],
48: [u'b', u'', u'B', u'B', u'', u'', u''],
49: [u'n', u'', u'N', u'N', u'', u'', u''],
50: [u'm', u'\n', u'M', u'M', u'', u'', u''],
51: [u',', u'', u'<', u'<', u'', u'', u''],
52: [u'.', u'', u'>', u'>', u'', u'', u''],
53: [u'/', u'', u'?', u'?', u'', u'', u''],
57: [u' ', u'', u' ', u' ', u'', u'', u''],
96: [u'\n', u'', u'', u'', u'', u'', u'']
}
}
self.eol = [(0, 28), (0, 96), (29, 39)]
self.layout = layout
self.device = None
devices = map(InputDevice, list_devices())
for device in devices:
if device_name in device.name:
self.device = InputDevice(device.fn)
print('Lecteur de codes-barres : ' + device.name)
break
self._listeners = []
Interruptable.__init__(self)
self.device.grab()
def start_capture(self):
"""TODO"""
def run():
barcode = ''
modifier = 0
keycode = 0
while not self.interrupted():
select([self.device], [], [], 0.25)
try:
for event in self.device.read():
if event.type == ecodes.EV_KEY:
data = categorize(event)
if data.keystate == 1:
if data.scancode in self.modifiers:
modifier = data.scancode
elif data.scancode in self.layouts[self.layout]:
keycode = data.scancode
elif event.type == ecodes.EV_SYN:
if (modifier, keycode) in self.eol:
if len(barcode) > 0:
for listener in self._listeners:
listener(barcode)
barcode = ''
elif keycode != 0:
barcode += self.layouts[self.layout][keycode][self.modifiers[modifier]]
modifier = 0
keycode = 0
except BlockingIOError:
pass
self.device.ungrab()
thread = threading.Thread(target=run, name='barcode_scanner')
thread.start()
def register_listener(self, callback):
self._listeners.append(callback)
关于python - 中断阻塞的 evdev 读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36453750/
对于一个简单的聊天程序,我使用了一个通过 boost::python 包装的 c 库。 使用 PyQT 编写了一个简单的 GUI。接收消息是通过阻塞调用完成的lib说。对于独立刷新的 GUI,通信部分
当我创建以下内容时,我试图创建一个可以被异常终止的线程类(因为我试图让线程等待一个事件): import sys class testThread(threading.Thread): def
我正在用 Haskell 编写服务器,我想在客户端断开连接后显式关闭它们。当我调用 hClose ,线程将阻塞,直到客户端关闭其一侧的句柄。有没有办法让它在不阻塞的情况下关闭? 提前致谢! 最佳答案
这个问题已经有答案了: 已关闭12 年前。 Possible Duplicate: garbage collection Operation 我有几个相关问题。 1.JAVA垃圾收集器运行时,是否占用
我有一个 Angular 函数,它在初始 URL 中查找“列表”参数,如果找到,就会出去获取信息。否则我想获得地理位置。如果存在 URL 参数,我不想获取地理位置。我使用的术语是否正确? constr
我读了很多关于锁定数据库、表和行的文章,但我想要较低的锁定,比如只锁定“操作”,我不知道如何调用它,假设我在 php 中有函数: function update_table() { //que
在我的多线程 mfc 应用程序中,m_view->SetScrollPos 处于阻塞状态并且所有应用程序都被卡住。 View 是在另一个线程中创建的,这是这种行为的原因吗? //SetScrollPo
FreeSwitch 软件在几天内运行良好(~3 - 5 天),然后由于 FreeSwitch 被阻止,新的来电请求被接受!!正在进行的调用继续他们的 session ,他们的调用似乎没有受到影响,但
我有一组按钮,当鼠标悬停在这些按钮上时,它们会改变颜色。这些的 CSS 以这种方式运行: #navsite ul li button { height: 60px; width: 60
由于某些原因,当我调用 WSARecvFrom 时,该函数在接收到某些内容之前不会返回。 _socket = WSASocket(AF_INET, SOCK_DGRAM, IPPROTO_UDP, N
我了解一些关于 Oracle 阻塞的知识——更新如何阻塞其他更新直到事务完成,写入者如何不阻塞读取者等。 我理解悲观和乐观锁定的概念,以及有关丢失更新等典型银行教科书示例。 我也理解 JDBC 事务隔
在两个代码点之间,我是否可以判断进程是否已被内核抢占,或者更确切地说,当时是否有任何其他代码在同一处理器上运行? //Point A some_type capture = some_capture(
这是我在 Oracle 的面试问题。 有一个堆栈,即使堆栈已满,push 操作也应该等到它完成,即使堆栈为空,pop 操作也应该等到它完成。 我们怎样才能做到这一点? 我的回答 让一个线程做push
我想知道是否有人可以告诉我如何有效地使用循环平铺/循环阻塞进行大型密集矩阵乘法。我正在用 1000x1000 矩阵做C = AB。我按照 Wikipedia 上的循环平铺示例进行操作,但使用平铺得到的
我正在阅读有关绿色线程的内容,并且能够理解这些线程是由 VM 或在运行时创建的,而不是由操作系统创建的,但我无法理解以下语句 When a green thread executes a blocki
我正在创建的 JavaScript API 具有以下结构: var engine = new Engine({ engineName: "TestEngine", engineHost
ChildWindow 是一个模态窗口,但它不会阻塞。有没有办法让它阻塞?我基本上想要一个 ShowDialog() 方法,该方法将调用 ChildWindow.Show() 但在用户关闭 Child
我需要一些关于如何调试 10.6 版本下的 Cocoa 并发问题的指导。我正在将“for”循环转换为使用 NSOperations,但大多数时候,代码只是在循环的某个时刻卡住。我可以在控制台中看到 N
我正在使用 ReportViewer 控件和自定义打印作业工作流程,这给我带来了一些问题。我的代码看起来有点像这样: ids.ForEach(delegate(Guid? guid)
我有以下成功复制文件的代码。但是,它有两个问题: progressBar.setValue() 之后的 System.out.println() 不会打印 0 到 100 之间的间隔(仅打印“0”直到
我是一名优秀的程序员,十分优秀!