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

  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 : 78
    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 : 78
    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 790
    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 790
    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

  7. #7
    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 pour tous ces éclairages je comprends un peu mieux la manière donc ça fonctionne. Je n'apprécie personnellement pas cette façon de programmer, car beaucoup de choses m'échappent à la lecture du code.

    Merci à tous

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Par défaut
    Je n'apprécie personnellement pas cette façon de programmer, car beaucoup de choses m'échappent à la lecture du code.
    Cela n'a rien à voir avec le langage ou la façon de programmer. Pour bien comprendre ici il faut connaître le principe de fonctionnement d'une interface graphique et la programmation dirigée par les évènements (event driven) avec traitement séquentiel de la queue des messages, dispatching, etc...
    Si tu regardes un programme C réalisant une interface avec l'API windows, les choses ne seront pas plus claires, bien au contraire.
    En outre, utiliser des bibliothèques (modules) relativement évoluées, n'est pas la meilleure façon de se familiariser avec un langage quel qu'il soit.
    En somme les problèmes viennent de ce que tu ne prends pas les choses à leur début.
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  9. #9
    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
    Bonjour,

    En outre, utiliser des bibliothèques (modules) relativement évoluées, n'est pas la meilleure façon de se familiariser avec un langage quel qu'il soit.
    Oui, n'étant pas programmeur à la base et apprenant la programmation de manière autodidacte, je suis très conscient qu'il me manque une base me permettant d'évoluer. Je ne comprend pas du tout la programmation dirigée par des événements et tous les mécanismes qui l'accompagne.

    As-tu des conseils pour aller plus loin dans la compréhension de ces mécanismes ?

    Merci

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Par défaut
    Citation Envoyé par polo42 Voir le message
    Bonjour,

    As-tu des conseils pour aller plus loin dans la compréhension de ces mécanismes ?

    Merci
    Il y a certainement de bonnes références en français, mais je ne les connais pas.
    J'ai vu tout cela il y a près de 20 ans en fonçant 'dans le dur' (ou dans le mur) avec l'API windows 3.10 en C.
    (Je ne recommande pas ce genre d'approche, mais 'nécessité fait loi')
    Puis plus tard, avec son enveloppe en C++ via les Microsoft Foundations Classes. C'est déjà plus digeste mais il faut connaître le langage et la P.O.O.
    Je pense qu'aujourd'hui, si les notices techniques en anglais ne te font pas peur, le mieux c'est peut être de commencer par la page wiki:
    http://en.wikipedia.org/wiki/Event-driven_programming
    Puis de suivre les liens.
    Certaines traductions françaises (des pages wiki) existent mais elles sont faméliques.
    Tu peux aussi aller voir le lien pdf :
    http://eventdrivenpgm.sourceforge.net/
    Le problème de la plupart des tutos, c'est qu'ils sont liés à un langage de programmation C++,Java ou Python:
    Je viens de repérer une fiche de TP dans l'environnement Python Qt:
    http://www.google.fr/url?sa=t&source...i_BryYELfviZJw
    C'est en français, cela parait simple et bien fait.
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  11. #11
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 790
    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 790
    Par défaut
    Salut,

    Les pistes donnés par Zavonen sont intéressantes mais peut être un peu raides. Les principes de la programmation 'event-driven' sont compliqués à acquérir via la lecture des spécifications de GUI construits là dessus.
    Par contre, ils sont assez simples à mettre en œuvre.

    Avec Python, le GUI par défaut s'appelle TKinter. C'est l'intégration de
    TK est un avatar de TCL. Langage de scripting rapide qui a eu ses heures de gloire à la fin des années 80.
    TK est aussi 'event-driven' mais conçu pour être utilisé avec des langages de script tel que Python dans lequel il est bien intégré. Vous n'avez pas besoin d'avoir un bagage POO important pour vous faire plaisir en réalisant quelques petites interfaces avec.
    Son défaut sera sans doute de vous permettre de faire de la programmation "event-driven" comme Mr Jourdain faisait de la prose.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  12. #12
    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 pour vos réponses,

    Je vais regarder tout ça...


  13. #13
    Membre émérite
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Par défaut
    Hmm... le principe grossier de la programmation événementielle, c'est qu'en général, une interface graphique est lancée, et le programme se met dans une écoute permanente de ce qui est effectué au sein de cette interface, et elle écoute, ce qui à été défini comme "événements", en général, c'est un clic de souris, un déplacement du curseur la pression d'une touche, un bouton graphique ayant été appuyé, tout ceci sont des évènements... et le principe c'est que quand un évènement arrive, le programme va chercher quelle fonction appeler. La majeure partie du temps, un objet regroupant toutes les information sur l'évènement qui vient d'avoir lieu est passé en paramètre à la dite fonction... voilà une première approche relativement grossière et théorique de la prog événementielle.

  14. #14
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 790
    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 790
    Par défaut
    Salut
    Cette réflexion me fait penser à Hollywood Principle
    et à Inversion of Control
    qui montrent que la programmation évènementielle à quand même fait pas mal de petits... en dehors des IHM.
    - 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: 06/05/2011, 00h16
  2. Besoin de comprendre un code
    Par deubelte dans le forum C++
    Réponses: 7
    Dernier message: 24/08/2010, 08h33
  3. Besoin de comprendre un code
    Par deubelte dans le forum C++
    Réponses: 11
    Dernier message: 06/07/2010, 18h29
  4. besoin de comprendre le développement sur cbuilder
    Par fomazou dans le forum C++Builder
    Réponses: 1
    Dernier message: 07/07/2006, 19h38

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