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

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 : Sélectionner tout - Visualiser dans une fenêtre à part
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

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