IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Douchette, Pyhook, Pythoncom et Thread


Sujet :

Python

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 27
    Par défaut 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

    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

  2. #2
    Membre éprouvé

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Par défaut
    Bonjour,
    je ne vais pas pouvoir répondre à ton post. Par contre, ton code m'intéresse pour la gestion de mes documents culturels (CD, DVD, livre).

    J'ai un petite question. Quelle douchette utilises-tu ?

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 328
    Par défaut
    Salut,

    J'avais compris que la douchette se comportait exactement comme un clavier. Du coup, pourquoi as-tu besoin de Pyhook ?

  4. #4
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour,

    Tout à fais.
    Un simple input suffit à lire un code avec un lecteur optique.
    Du coup quiz du thread, de time et de pythoncom.

    Et pourquoi ne pas lire le code en entier ?

    Par contre cette lecture doit être faite lors de l'execution d'un autre programme > Si une partie du programme nécessite une exécution en permanence c'est cette partie là qui doit être dans un thread. Pas une hypothétique saisie de code barre qui va capter toutes les saisies.
    Surtout vu ce qui est dit En effet je veux reprendre l'execution de mon main une fois le code barre lu..

    Bon, je ne comprend sans doute pas ce que vous voulez faire mais si un programme attend un code barre autant lui donner et ne pas se compliquer la vie, non ?

    Bon code

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 27
    Par défaut
    Bon ok vous n'avez pas toutes les infos.

    J'ai une interface en C# qui fait que de l'affichage, un moteur Python qui fait tous les traitements et une communication entre les deux que j'essaye de minimiser au maximun, ce qui veut dire que lorsque je demande en C# de saisir le code barre, c'est en Python que je veux le récupérer dans une variable (d'où le Pyhook). J'ai bien essayé le raw_input mais il est nécessaire que le curseur soit dans la console si je ne me trompe.

    Sinon en gros le programme a une éxecution comme suit :

    • initialisation
    • lit des infos
    • fait des claculs
    • demande lecture code barre
    • fait des vérifications avec le code barre et info
    • fini


    La lecture de code barre est donc juste un événement dans le déroulement du programme

    Merci pour ces premières réponses

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 27
    Par défaut
    Pour info la douchette bluetooth utilisée est une Metrologic Voyager bt MS9535

  7. #7
    Membre éprouvé

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Par défaut
    Merci pour l'info.

    Une question non Pythonesque mais en lien avec ce post : peut-on récupérer sur le net des infos sur un livre, un CD, un DVD à partir de son code barre ?

  8. #8
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    @rambc

    Derrière les bouquins (après 1970) tu trouve un code barre pour le numéro ISBN, International Standard Book Number. Code de 13 chiffres, et anciennement de 10 chiffres (2007), qui identifie le livre.
    Lorsque tu lis le code barre cela te donne l'ISBN
    En voici un par exemple 9780596515829

    Edit : Cela semble aussi bon pour les cd's. Exemple 5016022600826.

  9. #9
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Infos complémentaires:
    ASIN
    ISBN (Et oups, c'était 72 et non 70...)
    ISSN
    Etc...

  10. #10
    Membre éprouvé

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Par défaut
    Merci. Tes liens donnent une première piste intéressante.

    Si le livre est disponible chez amazon.fr, il suffit d'utiliser l'adresse ci-dessous avec le bon isbn10.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    http://www.amazon.fr/gp/product/isbn10
    Pour les CD et les DVD disponibles chez amazon.fr, on utilise l'adresse ci-dessous avec le bon ASIN.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    http://www.amazon.fr/dp/B0007DAYBA
    Malheureusement, certains codes sont à copier-coller à la main sur amazon.fr...

  11. #11
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonsoir,

    Citation Envoyé par Madmaxx18 Voir le message
    Bon ok vous n'avez pas toutes les infos
    Et de mon coté sans doute pas les compétences.
    Pour Pyhook cela vas encore mais la communication C#/Python alors que je bosse sous tux...
    De plus je n'utilise pas pythoncom. Donc, et bien que vous trouviez sur le net pas mal de blocages avec PumpMessages(), je ne serais pas vous aider.
    Désolé.

    Par contre:
    Citation Envoyé par Madmaxx18 Voir le message
    J'ai bien essayé le raw_input mais il est nécessaire que le curseur soit dans la console si je ne me trompe.
    Vous utilisez une console pour la saisie des codes barre ? (!)
    Dans ce cas pourquoi ne pas utiliser une 'console' en Python qui vous retourne le stdin ?
    Il existe pas mal d'exemples sur le forum (Sur base Tkinter entre autre) et dans les codes (IDLE) et vous pouvez avoir une version 'simplifiée' assez facilement.
    Je reste perplexe sur l'utilisation de la console.

    Mais... ^^
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        def OnKeyboardEvent(self,event):
            if event.Ascii==13:
                print 'entree saisi au clavier OK'
                print self.codeBarre
                globals()["code"] = self.codeBarre
                sys.exit()
    Un thread c'est asynchrone, non ?
    Ce n'est pas cela le problème ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Exception RuntimeError: RuntimeError('cannot join current thread',) in <module 'threading' from 'C:\Python26\lib\threading.pyc'> ignored
    Testez ceci.

    Voila. Du vrac sans doute mais j'espère avoir ouvert d'autres voies.

    Bon code.

  12. #12
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Re,

    Citation Envoyé par Madmaxx18 Voir le message
    Pour info la douchette bluetooth utilisée est une Metrologic Voyager bt MS9535
    Qu'importe, c'est le système qui gère.
    Soit cela passe en console, soit non.

Discussions similaires

  1. Tri multi-threadé
    Par Tifauv' dans le forum C
    Réponses: 8
    Dernier message: 28/06/2007, 09h00
  2. récupérer la valeur de sortie d'un thread
    Par jakouz dans le forum Langage
    Réponses: 3
    Dernier message: 31/07/2002, 11h28
  3. Programmer des threads
    Par haypo dans le forum C
    Réponses: 6
    Dernier message: 02/07/2002, 13h53
  4. Réponses: 5
    Dernier message: 12/06/2002, 15h12
  5. [Kylix] Pb de Thread !!
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 25/04/2002, 13h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo