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 :

Passer à la diapositive suivante


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 19
    Par défaut Passer à la diapositive suivante
    Bonjour,

    Je cherche à réaliser un programme qui me permettrai de changer la diapositive d'une présentation LibreOffice Impress, même si le focus n'est pas dessus. Pour récupérer l'information clavier j'utilise PyHook. J'ai un bout de code qui fonctionne et me permet d'afficher que la barre d'espace est appuyée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import pyHook, pythoncom
    txt="La barre d'espace est appuyée!!!"
     
    def OnKeyboardEvent(event):
        if event.KeyID==32:
            print(txt)
        return event.KeyID
     
    hooks_manager = pyHook.HookManager()
    hooks_manager.KeyDown = OnKeyboardEvent
    hooks_manager.HookKeyboard()
    pythoncom.PumpMessages()
    L'autre partie, celle nécessaire à piloter Impress, j'ai également un code qui fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import time
    from win32com.client.dynamic import Dispatch
    print('connexion au document impress')
    objServiceManager = Dispatch('com.sun.star.ServiceManager')
    Stardesktop = objServiceManager.CreateInstance('com.sun.star.frame.Desktop')
    diaporama = Stardesktop.getCurrentComponent()
    Pres = diaporama.Presentation
    time.sleep(5)
    print('démarrage du diaporama')
    Pres.start()
    time.sleep(2)
    Pres.Controller.gotoSlideIndex(1)
    Voilà où j'en suis et où je commence à bloquer. Dans l'idée, voici ce que je souhaiterai faire mais j'obtiens un message d'erreur :
    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
    import time
    from win32com.client.dynamic import Dispatch
    print('connexion au document impress')
    objServiceManager = Dispatch('com.sun.star.ServiceManager')
    Stardesktop = objServiceManager.CreateInstance('com.sun.star.frame.Desktop')
    diaporama = Stardesktop.getCurrentComponent()
    Pres = diaporama.Presentation
    time.sleep(5)
    print('démarrage du diaporama')
    Pres.start()
    time.sleep(2)
     
    import pyHook, pythoncom
    SlideNo=0
    txt="La barre d'espace est appuyée!!!"
    def OnKeyboardEvent(event):
        global SlideNo
        global Pres
        if event.KeyID==32:
            print(txt)
            SlideNo = SlideNo + 1
            Pres.Controller.gotoSlideIndex(SlideNo)
        return True
    hooks_manager = pyHook.HookManager()
    hooks_manager.KeyDown = OnKeyboardEvent
    hooks_manager.HookKeyboard()
    pythoncom.PumpMessages()
    Merci d'avance à tous ceux qui me permettront d'avancer par quelques pistes que ce soit.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 19
    Par défaut
    Bonjour à tous,

    Je suis toujours en difficulté. Tout d'abord je ne comprend pas pourquoi je n'arrive pas à passer ma variable Pres en global dans la fonction OnKeyboardEvent.
    Ensuite pour contourner ce problème je me dit que je peut tester ce que me retourne la fonction OnKeybordEvent dans le programme principal. C'est là que je me rend compte que je ne comprend pas bien le fonctionnement de pyhook.
    Ma première interrogation concerne cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hooks_manager.KeyDown = OnKeyboardEvent
    Est-ce que cela veut-il dire que la fonction hooks_manager.KeyDown est remplacée par notre fonction OnKeybordEvent?
    Deuxièmement, comment puis-je récupérer le résultat de OnKeybordEvent? De ce que je comprend la boucle est définie par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pythoncom.PumpMessages()
    Je ne comprend d'ailleurs pas comment fonctionne cette boucle. Et surtout j'aimerai mieux une boucle while que je maîtrise mieux. Je continue de chercher une solution, si certaines personne peuvent me faire avancer je les en remercie d'avance.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 19
    Par défaut
    Bonjour,

    petit état de mes avancements, comme je le disais précédemment je ne comprenais pas bien l'utilisation de pyhook. Dans mes recherches j'ai trouvé la bibliothèque keyboard:
    https://github.com/boppreh/keyboard
    Elle est pour moi beaucoup plus compréhensible et clair. Le script que j'utilise est alors le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    import keyboard
     
    def print_pressed_keys(e):
        if list(keyboard._pressed_events.keys()) == [57]:
            print("La barre d'espace est appuyée!!!")
     
    keyboard.hook(print_pressed_keys)
    keyboard.wait('esc')
    De plus la fonction wait propose de définir une ou plusieurs clés de sortie de la boucle. Ce petit script est parfait pour moi, il fait ce que je lui demande. Je l'ai donc intégré pour qu'il fonctionne avec impress avec ce 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
    31
    32
    33
    import keyboard, time
    from win32com.client.dynamic import Dispatch
     
    def print_pressed_keys(e):
        global SlideNo
        if list(keyboard._pressed_events.keys()) == [57]:
            SlideNo = SlideNo + 1
            print(txt)
            ChgtDia(SlideNo)
     
    def ChgtDia(NoDia):
        global Control
        print('Changement de la diapo')
        Control.gotoSlideIndex(NoDia)
        return True
     
     
    SlideNo=0
    txt="La barre d'espace est appuyée!!!"
     
    print('connexion au document impress')
    objServiceManager = Dispatch('com.sun.star.ServiceManager')
    Stardesktop = objServiceManager.CreateInstance('com.sun.star.frame.Desktop')
    diaporama = Stardesktop.getCurrentComponent()
    Pres = diaporama.Presentation
    time.sleep(5)
    print('démarrage du diaporama')
    Pres.start()
    Control=Pres.Controller
    time.sleep(2)
     
    keyboard.hook(print_pressed_keys)
    keyboard.wait('esc')
    Mais j'obtiens toujours la même erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Traceback (most recent call last):
      File "C:\Users\Vendeur\AppData\Local\Programs\Python\Python37-32\lib\site-packages\keyboard\_generic.py", line 22, in invoke_handlers
        if handler(event):
      File "D:\Drive\PeepShow\PeepShowV02.py", line 9, in print_pressed_keys
        ChgtDia(SlideNo)
      File "D:\Drive\PeepShow\PeepShowV02.py", line 14, in ChgtDia
        Control.gotoSlideIndex(NoDia)
      File "C:\Users\Vendeur\AppData\Local\Programs\Python\Python37-32\lib\site-packages\win32com\client\dynamic.py", line 1053, in __getattr__
        raise AttributeError("%s.%s" % (self._username_, attr))
    AttributeError: <unknown>.gotoSlideIndex
    Je continue donc mes recherches et je suis toujours preneur de pistes de réflexions

  4. #4
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    C'est le code de PeepShowV02.py que tu devrais montrer.
    Manifestement, Control ne semble pas être ce que tu penses.

Discussions similaires

  1. Passer à la diapositive suivante
    Par cin144 dans le forum Powerpoint
    Réponses: 1
    Dernier message: 15/01/2010, 06h06
  2. [Tableaux] Passer à l'élément suivant
    Par cyrill.gremaud dans le forum Langage
    Réponses: 2
    Dernier message: 13/09/2006, 10h31
  3. Power Point : Passage à la diapositive suivante sans cliquer
    Par snoopy69 dans le forum Autres Logiciels
    Réponses: 3
    Dernier message: 15/05/2006, 15h09
  4. Sous-Formulaire : Passer à l'enregistrement suivant
    Par snoopy69 dans le forum Access
    Réponses: 4
    Dernier message: 27/04/2006, 13h22
  5. Etat : comment passer à la page suivante
    Par Celia1303 dans le forum Access
    Réponses: 2
    Dernier message: 26/10/2005, 16h45

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