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

GUI Python Discussion :

Gestion evenements externe à l'application


Sujet :

GUI Python

  1. #1
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 160
    Points : 91
    Points
    91
    Par défaut Gestion evenements externe à l'application
    Bonjour, est-il possible, que ce soit avec Tk, Wx ou PyQt de capturer des évenements extérieurs à l'application python?

    Je n'ai trouvé que ce post:
    http://www.developpez.net/forums/d54...urs-programme/
    mais il ne contient pas de réponse à ma question.

    Pour mieux me faire comprendre:
    en fait je veux faire une petite application de type launcher qui tourne en tache de fond et que l'on peut appeler à tout moment (donc quand l'application n'a pas le focus) avec un raccourci clavier. D'où ma question sur la capture d'évenements en dehors de l'application.

    Une idée?

    Merci d'avance.

  2. #2
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 160
    Points : 91
    Points
    91
    Par défaut
    J'ai trouvé pyhook:
    http://pyhook.wiki.sourceforge.net/

    ca a l'air de faire ce que je demande mais c'est plateforme (windows) dépendant. Pour l'instant ca me va mais peut être qu'il existe quelque chose qui soit plateforme indépendant?

    Question à ceux qui connaissent PyQt:
    y a t il un équivalent intégré à Qt?

  3. #3
    Membre expérimenté Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Points : 1 728
    Points
    1 728
    Par défaut
    Salut,

    Je ne connais pas PyQT mais concernant wxpython, il est possible de créer des events personnalisés et de les envoyer à l'application via la méthode wx.PostEvent.
    "Etre conscient de la difficulté permet de l'éviter.."
    Lao-Tseu.

  4. #4
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 160
    Points : 91
    Points
    91
    Par défaut
    Merci pour le tuyau sous wx. Donc, je vais essayer wx au lieu de qt.

    J'ai essayé de trouver un peu plus d'infos sur wx.postevent dans le cadre de l'utilisation que je veux en faire car je ne suis pour l'instant pas familier de wx (ni de qt), mais je n'ai pas trouvé de tutoriel. En avez vous un "sous la main"?

    Merci encore.

  5. #5
    Membre averti Avatar de alexdevl
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    265
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 265
    Points : 344
    Points
    344

  6. #6
    Membre expérimenté Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Points : 1 728
    Points
    1 728
    Par défaut
    Pour le wx.PostEvent, tu peux regarder le code source du compresseur de photos.
    "Etre conscient de la difficulté permet de l'éviter.."
    Lao-Tseu.

  7. #7
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 160
    Points : 91
    Points
    91
    Par défaut
    Merci, je vais étudier cela de près.

    Merci et bonne fêtes à tous.

  8. #8
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 160
    Points : 91
    Points
    91
    Par défaut
    Je ne suis que débutant en programmation, et je découvre tout juste wx, mais pour ce que j'ai pu voir dans l'exemple du recompresseur photo, wx.postevent s'utilise à partir du bouton compresser/arrêter. Ce qui veut dire que l'application a toujours le focus et reçoit donc un evenement.

    Dans mon cas, je veux que mon application python reçoive un évènement clavier alors que le focus est sur une autre application (firefox par exemple) de façon à ce qu'elle prenne le focus et face apparaitre sa propre fenêtre au premier plan.

    J'espère que vous n'allez pas me dire que je n'ai rien compris à l'exemple du recompresseur photo...

  9. #9
    Membre émérite
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Points : 2 533
    Points
    2 533
    Par défaut
    Si c'est sous windows et seulement sous windows, l'api permets de capturer les évènements du système.

    Voir la doc ici : http://msdn.microsoft.com/en-us/library/ms997537.aspx

    Par contre python ne permets pas d'attaquer l'api windows directement, il faut passer par une extension à python qui se trouve ici et qui permets d'appeler les fonctions de l'api windows par python, mais je ne sais pas si l'on peut tout faire.

    http://starship.python.net/crew/mhammond/

    Après une petite recherche sur google, j'ai trouvé un sujet qui en parle, mais la réponse semble être qu'il est impossible de faire celà en python.

    http://www.mail-archive.com/python-w.../msg03579.html

    Essayes de chercher un peu par toi même, les mot clés sont : win32 pyhon hook.

    Désolé je n'ai pas plus d'élément que ça et c'est un sujet assez complexe, même quand on attaque l'api windows en natif.

    [Edit]Je viens de relire la question de départ :
    Pour mieux me faire comprendre:
    en fait je veux faire une petite application de type launcher qui tourne en tache de fond et que l'on peut appeler à tout moment (donc quand l'application n'a pas le focus) avec un raccourci clavier. D'où ma question sur la capture d'évenements en dehors de l'application.

    Une idée?

    Merci d'avance.
    Si je m'en tiens à cette demande et toujours sous windows, tu as la possibilités d'associer un raccourci clavier à un raccourci poser sur le bureau (clic droit/propriétés). Ce raccourci clavier à 2 fonctions, soit de lancer ton application, si celle ci ne tourne pas, soit de ramener la fenêtre de ton application au premier plan si elle est déjà active. Je pense que ca devrait correspondre à ta demande.

    Fait un essai.
    Si ce message vous a semblé utile, il est possible qu'il soit utile à d'autres personnes. Pensez au . Et n'oubliez pas le le moment venu !

    On n'a pas à choisir si l'on est pour ou contre la décroissance, elle est inéluctable, elle arrivera qu'on le veuille ou non.

  10. #10
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 160
    Points : 91
    Points
    91
    Par défaut
    Sous windows, pyhook fonctionne:
    http://pyhook.wiki.sourceforge.net/pyHook_Tutorial

    Note personnelle: mettre le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pythoncom.PumpMessages()
    de l'exemple du lien ci dessus après le
    de votre propre application sinon le MainLoop ne semble pas se lancer.

    Sous linux, j'ai vaguement vu quelque chose à propos de xlib... mais je me cantonne à windows pour l'instant!

  11. #11
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 160
    Points : 91
    Points
    91
    Par défaut
    Pyhook fonctionne donc je n'ai pas testé ce qui suit mais voici quelques éventuelles possibilités :

    Pour wx, je viens de trouver cela (sous windows seulement apparemment...) pour le clavier :
    http://docs.wxwidgets.org/stable/wx_...registerhotkey

    Peut être ça pour la souris mais je ne suis pas sur d'avoir compris, donc je ne fais qu'émettre une hypothèse:
    http://docs.wxwidgets.org/stable/wx_...pturelostevent

    C'est toujours bon à savoir au ca où....

  12. #12
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 160
    Points : 91
    Points
    91
    Par défaut
    J'ai testé le registerhotkey et ca marche. voici un exemple pour alt+left inspiré de l'exemple trouvé ici:

    Seul problème, seul les keycodes des touches spéciales fonctionnent, pour les touches correspondant aux lettres de l'alphabet, j'ai essayé VK_A mais cela ne fonctionne pas.

    Une idée pour m'aider à utiliser n'imorte quelle touche (en fait je n'en ai pas besoin, mais cela peut servir incessamment sous peu...)?
    Note j'ai trouvé les codes ici ou par exemple.

    autre question : à quoi sert le "hotkeyID", en effet cela ne change rien si j'en met un qui ne correspond pas à ce que j'ai dans la table key 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
    27
    28
    29
    30
    import wx
    import win32con #for the VK keycodes
     
    class FrameWithHotKey(wx.Frame):
        def __init__(self, *args, **kwargs):
            wx.Frame.__init__(self, *args, **kwargs)
            self.regHotKey()
     
            self.Bind(wx.EVT_HOTKEY, self.handleHotKey, id=self.hotKeyId)
        def regHotKey(self):
            """
            This function registers the hotkey Alt+F1 with id=100
            """
            self.hotKeyId = 25
            self.RegisterHotKey(
                self.hotKeyId, #a unique ID for this hotkey
                win32con.MOD_ALT, #the modifier key
                win32con.VK_LEFT) #the key to watch for
        def handleHotKey(self, evt):
            """
            Prints a simple message when a hotkey event is received.
            """
            print "do hot key actions"
     
     
    if __name__ == "__main__":
        app = wx.App()#redirect=True, filename="err.log")
        frame = FrameWithHotKey(None,-1,'my application')
        frame.Show(True)
        app.MainLoop()

Discussions similaires

  1. Gestion de fenêtre d'application externe
    Par AsH.fr dans le forum Agents de placement/Fenêtres
    Réponses: 5
    Dernier message: 09/07/2009, 09h19
  2. [FB] Gestion des erreurs et application francophone
    Par Benjamin GAGNEUX dans le forum Installation
    Réponses: 10
    Dernier message: 20/05/2006, 14h54
  3. [VBA-E] evenement avant quitter application
    Par fisherman dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 12/05/2006, 13h11
  4. Réponses: 3
    Dernier message: 10/02/2006, 17h33
  5. Gestion evenement souris
    Par Bugmaster dans le forum Agents de placement/Fenêtres
    Réponses: 15
    Dernier message: 30/07/2004, 08h40

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