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 :

Besoin de comprendre


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    175
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 175
    Par défaut Besoin de comprendre
    Bonjour,

    J'ai récupéré un petit code sur le net. En fait je ne comprend tout simplement pas le code et surtout comment sont transmis les événements.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hm.MouseAll = OnMouseEvent
    Comment la fonction OnMouseEvent est elle appelée sans argument?
    Comment l'argument event est transmit à OnMouseEvent?
    Pourquoi faut il faire return True ?

    Moi j'aurais fait un truc comme ça

    if hm.MouseAll == True:
    OnMouseEvent(event)

    Enfin bref je ne comprend pas...Je ne suis pas programmeur donc je ne capte peut être pas toutes les subtilités.

    Voici le code
    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
     
    import pythoncom, pyHook 
     
    def OnMouseEvent(event):
      # called when mouse events are received
      print 'MessageName:',event.MessageName
      print 'Message:',event.Message
      print 'Time:',event.Time
      print 'Window:',event.Window
      print 'WindowName:',event.WindowName
      print 'Position:',event.Position
      print 'Wheel:',event.Wheel
      print 'Injected:',event.Injected
      print '---'
     
    # return True to pass the event to other handlers
      return True
     
    # create a hook manager
    hm = pyHook.HookManager()
    # watch for all mouse events
    hm.MouseAll = OnMouseEvent
    # set the hook
    hm.HookMouse()
    # wait forever
    pythoncom.PumpMessages()
    Merci

  2. #2
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 77
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Par défaut
    Je suppose que l'extrait de code provient d'ici:
    http://sourceforge.net/apps/mediawik...yHook_Tutorial
    L'instruction hm.MouseAll = OnMouseEvent redirige tous les évènements liés à la souris vers la fonction OnMouseEvent définie plus haut et qui n'est qu'une fonction de démo interceptant les paramètres du message souris et les affichant en clair.
    J'ai cru comprendre que cela fonctionne uniquement avec windows.
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    175
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 175
    Par défaut
    Merci,

    Oui j'ai compris que les événements étaient redirigés vers la fonction. Mais ce que je ne comprends pas c'est la manière de le faire, c'est à dire affecter une fonction à une méthode avec = ?

    De plus je ne vois pas vraiment par quel mécanisme "return True" permet d'indiquer au gestionnaire d'événements qu'il peut continuer son job.


  4. #4
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 77
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Par défaut
    De plus je ne vois pas vraiment par quel mécanisme "return True"
    Ces fonctions 'callback' du gestionnaire d'évènement doivent retourner une valeur logique.
    Je pense qu'en l'occurrence return False ferait aussi bien l'affaire.
    Dès la fin de l'exécution on passe au message suivant dans la file d'attente. Les messages autres que ceux provenant de la souris sont ignorés et le prochain message souris est traité par la même fonction.
    Pour en savoir plus sur hm.MouseAll = OnMouseEvent il faudrait aller voir la doc du module hm et voir ce que représente l'objet MouseAll. En général pour ces tutos 'pédagogiques' on néglige cet aspect des choses et on demande simplement de croire que l'instruction fait bien ce qu'on dit.
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  5. #5
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    Zavonen a bien expliqué mais je voudrais préciser une chose.

    Quand hm.MouseAll = OnMouseEvent est exécuté, la fonction OnMouseEvent n'est pas appelée. C'est l'objet fonction lui-même qui est assigné à hm.MouseAll, qui n'est pas une méthode mais un attribut de hm (ou peut-être une property). C'est le gestionnaire d'event lui-même, quelque part dans PumpMessage, qui effectuera un appel du genre hm.MouseAll(event), ce qui aura pour effet d'appeler OnMouseEvent(event) de par l'affectation.

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 753
    Par défaut
    Salut

    Personnellement, je raconterai cela différemment(un peu).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    # create a hook manager
    hm = pyHook.HookManager()
    # watch for all mouse events
    hm.MouseAll = OnMouseEvent
    # set the hook
    hm.HookMouse()
    # wait forever
    pythoncom.PumpMessages()
    hm.MouseAll = OnMouseEvent remplace la méthode MouseAll de hm par la fonction OnMouseEvent....
    Et donc tous les appels à MouseAll vont être traités par OnMouseEvent: la seule contrainte est qu'OnMouseEvent doit respecter l'interface de la fonction remplacée:
    • accepter un paramètre
    • retourner un Booléen... True!

    Note: le callback était MouseAll, OnMouseEvent est un "mock"

    Ca marche parce que:
    • Python est un langage dynamique
    • La plupart des structures de données modules, classes, instances sont des "dictionnaires" que vous pouvez construire, modifier à la volée


    Par rapport aux langages compilés, c'est très souple...
    Et si vous n'utilisez pas ces possibilités avec modération et seulement lorsque vous ne pouvez faire autrement, vous écrirez du code difficile de relire et à comprendre "plus tard".

    Vous pouvez néanmoins utiliser sans trop de soucis ce genre de technique pour écrire des tests "unitaires". Dans ce cas, vous remplacez les méthodes appelées par des fonctions à vous qui retournent des valeurs prédéfinies ou choisies au hasard et vous vérifiez que l'appelant "réagit" comme attendu.

    En espérant que vous pourrez tirer profit de ces différents éclairages.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Besoin de comprendre l'hébergement.
    Par maestro982 dans le forum Hébergement
    Réponses: 6
    Dernier message: 05/05/2011, 23h16
  2. Besoin de comprendre un code
    Par deubelte dans le forum C++
    Réponses: 7
    Dernier message: 24/08/2010, 07h33
  3. Besoin de comprendre un code
    Par deubelte dans le forum C++
    Réponses: 11
    Dernier message: 06/07/2010, 17h29
  4. besoin de comprendre le développement sur cbuilder
    Par fomazou dans le forum C++Builder
    Réponses: 1
    Dernier message: 07/07/2006, 18h38

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