Re: [script nvda] Utiliser les objets dans une extension

  • From: yannick <philaos31@xxxxxxx>
  • To: script NVDA <scriptnvda@xxxxxxxxxxxxx>
  • Date: Thu, 1 Jun 2023 02:32:53 +0200

salut voici mon explication, peut être que Pierre te l'as envoyé en perso : si je ne fais pas attention, je répond toujours en perso .
# on vérifie que la fenêtre a pour classe ThunderRT6TextBox et que son ControlID est égal à 9.
        if fo.windowClassName == "ThunderRT6TextBox" and fo.windowControlID == 9 :
                on envoie la touche alt +c, mais on aurait pu écrire gesture.fromName("Alt+C").send()
keyboardHandler.KeyboardInputGesture.fromName("alt+c").send()
                    NVDA prononce la valeur de l'bjet focus (fo)
            ui.message(fo.value)
        else : # cas très peu probable
                # on envoie la touche qui a appelé ce script
            gesture.send()


Le 30/05/2023 à 14:20, Nael Sayegh a écrit :

Bonjour Pierre-Louis,
Merci beaucoup pour votre rééponse.
Je ne comprends cette partie du code:
        if fo.windowClassName == "ThunderRT6TextBox" and fo.windowControlID == 9 :
keyboardHandler.KeyboardInputGesture.fromName("alt+c").send()
            ui.message(fo.value)
        else : # cas très peu probable
            gesture.send()

Pourriez-vous me l'expliquer plus en détail?
Cordialement
Monsieur Nael Sayegh
https://www.nael-accessvision.com/
Chaîne youtube: nael accessvision
https://www.youtube.com/c/naelaccessvision
Le 30/05/2023 à 11:46, Pierre-Louis R@RPTools a écrit :
Bonjour Nael et tous,

Pour une extension qui ne doit scripter qu'un seul contrôle, je trouve la solution de Cyrille et Yannick un peu lourde.
Mais il est bon de savoir l'utiliser pour de plus grosses applications.

J'ai modifié ton script result comme suit :
en début de fichier, eccrire :
import controlTypes

et dans ta classe AppModule, coller la méthode ci-dessous :

@scriptHandler.script(gesture="kb:enter", description="Calsci: Donne le résultat d'un 
calcul", category="Calsci")
        def script_Enter(self, gesture):
                fo = api.getFocusObject()
                # si le focus n'est pas sur une zone d'édition
                if hasattr(fo, "role") and fo.role != 
controlTypes.Role.EDITABLETEXT :
                        return gesture.send() # on doit renvoyer le geste
                if fo.windowClassName == "ThunderRT6TextBox" and 
fo.windowControlID == 9 :
                        
keyboardHandler.KeyboardInputGesture.fromName("alt+c").send()
                        ui.message(fo.value)
                else : # cas très peu probable
                        gesture.send()

J'ai testé et cela fonctionne.
Cordialement, Pierre-Louis

Le 30-05-23 à 10:52, yannick a écrit :
salut comme l'a dit Cyril, tu devras utiliser la méthode chooseNVDAObjectOverlayClasses pour surcharger une classe.

voici un exemple joint à ce mail et collé ci-dessous.

ça manque clairement d'explication, mais dit nous les points qui te posent problème.


import appModuleHandler
import controlTypes
from NVDAObjects.IAccessible import IAccessible
import scriptHandler
import ui

class AppModule(appModuleHandler.AppModule):
    def chooseNVDAObjectOverlayClasses(self, obj, clsList):
        if obj.role == controlTypes.Role.EDITABLETEXT:
            clsList.insert(0, Edit)

class Edit(IAccessible):
    @scriptHandler.script(gesture="kb:enter")
    def script_test(self, gesture):
        ui.message("oui")

Le 30/05/2023 à 09:15, Nael Sayegh a écrit :
Bonjour à tous,
Pour mon extension Calsci, je cherche à faire appliquer le raccourci entré seulement sur la zone d'édition.
Je pense que pour faire ça, je dois indiquer dans mon code un objet particulier pour que le raccourci s'active.
Comment peut-on utiliser les objets de NVDA en python?
Merci d'avance pour vos réponses.

Other related posts: