Douchette, Pyhook, Pythoncom et Thread
Bonjour,
J'essaye de lire un code barre avec une douchette en Python, à l'aide de Pyhook(lib trouvable là : http://sourceforge.net/apps/mediawik...itle=Main_Page) et Pythoncom j'ai trouvé ce qu'il me fallait. Si vous avez pas de douchette et que vous voulez aider, sachez qu'une douchette se comporte exactement comme un clavier :ccool:
Mon code barre est toujours fini par entrée dans mon cas, donc je stock les caractères tappés jusqu'à un hit de la touche entrée.
Par contre cette lecture doit être faite lors de l'execution d'un autre programme, et pythoncom.PumpMessages() est bloquant. Du coup j'ai essayé de mettre le tout dans un thread que j'essaye de killer lorsque celui ci a lu mon code barre.
En effet je veux reprendre l'execution de mon main une fois le code barre lu.
Mais c'est pas bon, voir l'erreur si après. Je sais que killer les threads en Python c'est pas très clean mais je vois pas comment m'en sortir avec le fameux pythoncom.PumpMessages() que je n'arrive pas à contourner.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| # -*- coding: cp1252 -*-
import time
import pythoncom, pyHook
from threading import Thread
class Mythread(Thread):
def __init__ (self):
Thread.__init__(self)
# create a hook manager
self.hm = pyHook.HookManager()
self.codeBarre = ''
def run(self):
# set the hook
self.hm.HookKeyboard()
# watch for all keyboardsevents
self.hm.KeyDown = self.OnKeyboardEvent
# wait forever
pythoncom.PumpMessages()
def OnKeyboardEvent(self,event):
if event.Ascii==13:
print 'entree saisi au clavier OK'
print self.codeBarre
globals()["code"] = self.codeBarre
sys.exit()
return True
if event.Ascii != None:
if chr(event.Ascii) in ['0','1','2','3','4','5','6','7','8','9']:
print chr(event.Ascii)
self.codeBarre += chr(event.Ascii)
else:
print "other character"
return False
if __name__ == "__main__" :
globals()["code"] = ''
p1 = Mythread()
p1.start()
time.sleep(10)
print 'code from main '+globals()["code"] |
La sortie console
Citation:
22
22
22
22
55
66
66
55
entree saisi au clavier OK
22225665
Exception RuntimeError: RuntimeError('cannot join current thread',) in <module 'threading' from 'C:\Python26\lib\threading.pyc'> ignored
Donc si vous avez des idées sur ce problème !
D'avance merci
Ciao