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 :

Surcharge de la méthode d'un objet


Sujet :

Python

  1. #1
    Membre à l'essai
    Inscrit en
    Février 2007
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 6
    Par défaut Surcharge de la méthode d'un objet
    Bonjour,

    Voici mon problème:
    Je cherche à piloter CanAlyser via un code python.

    J'ai trouvé ce code sur le net qui fonctionne presque:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Application = Dispatch("CANalyzer.Application")
    Measurement = Application.Measurement
    ApplicationEvents = WithEvents(Application,ApplEvents)
    MeasurementEvents=WithEvents(Measurement,MeasEvents)
    CAPL=Application.CAPL
    Application.Open("C:\\Users\\test.cfg")
     
    ref=CAPL.GetFunction("TEST")
    Measurement.Start()
    wait(2000)  
    ref.Call(1) #this is ignored by canalyzer
    Le souci est que "ref=CAPL.GetFunction("TEST")" doit être exécuté sur l'événement OnInit de l'objet Measurement. Et c'est là que je coince.

    En VBA ça donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub Measurement_OnInit()
    Set ref= App.Capl.GetFunction("TEST")
    End Sub
    Est il possible de faire la même chose en python?

  2. #2
    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
    Ben c'est pas justement à ça que sert WithEvents ?
    C'est quoi MeasEvents ?
    Ca pourrait ressembler à ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class MeasEvents:
        def OnInit(self):
            ...

  3. #3
    Membre à l'essai
    Inscrit en
    Février 2007
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 6
    Par défaut
    Effectivement ton idée fonctionne, je te remercie pour ta réponse.

    Néanmoins, j'ai toujours un souci.
    Le code devient:

    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
    import win32com.client
    WithEvents = win32com.client.WithEvents
    Application = win32com.Dispatch("CANalyzer.Application")
    CAPL=Application.CAPL
     
    class MeasEvents:
        def OnInit(self):
            print "Measurement.OnInit()"
            ref=CAPL.GetFunction("TEST")
     
    Measurement = Application.Measurement
    MeasurementEvents=WithEvents(Measurement,MeasEvents)
     
    Application.Open("C:\\Users\\test.cfg")
     
    Measurement.Start()
     
    ref.Call(1)
    L'objet 'ref' n'existe pas lorsqu'il est appelé.
    Je ne sais pas comment le récupérer depuis la méthode 'OnInit()'.

  4. #4
    Membre éclairé
    Avatar de airod
    Homme Profil pro
    Gérant Associé, DMP Santé et Directeur technique
    Inscrit en
    Août 2004
    Messages
    767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Gérant Associé, DMP Santé et Directeur technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 767
    Par défaut
    ref doit devenir self.ref pour y accéder depuis l'instance de MeasEvents.
    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
     
    import win32com.client
    WithEvents = win32com.client.WithEvents
    Application = win32com.Dispatch("CANalyzer.Application")
    CAPL=Application.CAPL
     
    class MeasEvents:
        def OnInit(self):
            print "Measurement.OnInit()"
            self.ref=CAPL.GetFunction("TEST")
     
    Measurement = Application.Measurement
    me=MeasEvents()
    MeasurementEvents=WithEvents(Measurement,me)
     
    Application.Open("C:\\Users\\test.cfg")
     
    Measurement.Start()
     
    me.ref.Call(1)
    je pense que ca devrait fonctionner!

  5. #5
    Membre à l'essai
    Inscrit en
    Février 2007
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 6
    Par défaut
    Cette solution ne fonctionne pas.

    Le message d'erreur spécifie que l'instance "WithEvents" prend 2 arguments mais que 3 lui sont donnés.

    J'ai encore des lacunes en langage objet, cette erreur est elle due au fait que 'me' est un objet et 'MeasEvents' une classe? L'instance "WithEvents" prenant comme argument un objet et une classe.

    J'ai essayé en déclarant "ref" en tant que "variable" globale mais sans résultat.
    Est il possible de déclarer un objet en global?

  6. #6
    Membre éclairé
    Avatar de airod
    Homme Profil pro
    Gérant Associé, DMP Santé et Directeur technique
    Inscrit en
    Août 2004
    Messages
    767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Gérant Associé, DMP Santé et Directeur technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 767
    Par défaut
    dans ce cas est ce que cela fonctionne?!
    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
     
     
    import win32com.client
    WithEvents = win32com.client.WithEvents
    Application = win32com.Dispatch("CANalyzer.Application")
    CAPL=Application.CAPL
     
    class MeasEvents:
        def OnInit(self):
            print "Measurement.OnInit()"
            self.ref=CAPL.GetFunction("TEST")
     
    Measurement = Application.Measurement
    MeasurementEvents=WithEvents(Measurement,MeasEvents)
     
    Application.Open("C:\\Users\\test.cfg")
     
    Measurement.Start()
     
    Measurement.ref.Call(1)
    ou puis je voir la doc de l'api?

    si je comprend, WithEvents permet d'étendre Measurement avec MeasEvents?!
    dans ce cas, ref devient attribut de Measurement.

  7. #7
    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
    A essayer aussi:
    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
    import win32com.client
    WithEvents = win32com.client.WithEvents
    Application = win32com.Dispatch("CANalyzer.Application")
    CAPL=Application.CAPL
     
    class MeasEvents:
        def OnInit(self):
            print "Measurement.OnInit()"
            self.ref=CAPL.GetFunction("TEST")
     
    Measurement = Application.Measurement
    MeasurementEvents=WithEvents(Measurement,MeasEvents)
     
    Application.Open("C:\\Users\\test.cfg")
     
    Measurement.Start()
     
    MeasurementEvents.ref.Call(1)
    Je n'ai rien trouvé là-dessus dans le doc de pywin32, elle n'est pas très bien faite...
    Si quelqu'un à une meilleure doc je serais intéressé aussi...

  8. #8
    Membre à l'essai
    Inscrit en
    Février 2007
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 6
    Par défaut
    Merci encore pour votre aide.

    Aucun des objets 'Measurement' ou 'MeasurementEvents' ne récupère l'attribut 'ref'.

    Sur le net j'ai trouvé un moyen de déclarer un objet considéré comme une classe, également appelé Classe-Objet.

    Ca donne:

    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
    import win32com.client
    from new import classobj
     
    WithEvents = win32com.client.WithEvents
    Application = win32com.Dispatch("CANalyzer.Application")
    CAPL=Application.CAPL
     
    class MeasEvents:
        def OnInit(self):
            print "Measurement.OnInit()"
            self.ref=CAPL.GetFunction("TEST")
     
    handler = classobj('Handler',(MeasEvents,),{}) # Declaration de la Classe-Objet
     
    Measurement = Application.Measurement
    MeasurementEvents=WithEvents(Measurement,handler)
     
    Application.Open("C:\\Users\\test.cfg")
     
    Measurement.Start()
     
    handler.ref.Call(1)
    Mais ça ne marche toujours pas.
    J'ai alors voulu voir s'il est possible de jouer avec des attributs de 'handler':

    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
    import win32com.client
    from new import classobj
     
    WithEvents = win32com.client.WithEvents
    Application = win32com.Dispatch("CANalyzer.Application")
    CAPL=Application.CAPL
     
    class MeasEvents:
        def OnInit(self):
            print "Measurement.OnInit()"
            self.ref=CAPL.GetFunction("TEST")
            print "Handler.value (MeasEvents) = %d"%self.value
            self.value += 1
     
    handler = classobj('Handler',(MeasEvents,),{}) # Declaration de la Classe-Objet
    handler.value = 1
    Measurement = Application.Measurement
    MeasurementEvents=WithEvents(Measurement,handler)
     
    Application.Open("C:\\Users\\test.cfg")
     
    Measurement.Start()
     
    print "Handler.value = %d"%handler.value
    handler.ref.Call(1)
    Le résultat de l'exécution m'étonne un peu.
    J'obtient le comportement suivant:

    > Handler.value = 1
    > Erreur "handler a n'a d'attribut ref"
    > Measurement.OnInit()
    > Handler.value (MeasEvents) = 1

    Je suis certain que l'événement OnInit() est exécuté lors de la création de 'Measurement'.
    Néanmoins, selon le résultat, il semble que le code soit exécuté en dernier. ce qui "expliquerait" que l'objet ne soit pas reconnu.

    Pour information, si on rajoute 'self.ref.Call(1)' dans l'événement OnInit(), la fonction "TEST" est exécutée correctement.

    Je n'ai pas de doc à vous fournir, désolé.

  9. #9
    Membre à l'essai
    Inscrit en
    Février 2007
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 6
    Par défaut
    J'ai la solution à mon problème mais pas à celui qui nous concerne.
    Je m'explique...

    Je travaille avec un logiciel de programmation graphique permettant de piloter des bancs de test, la plupart des actions sont réalisées par des "blocs" tout prêts qu'il suffit d'organiser en leur donnant les arguments qui vont bien.
    Certains blocs autorisent l'ajout de code Python, pour le traitement des résultats par exemple.

    Si on utilise deux blocs d'exécution de code Python en série, comme indiqué ci dessous, le code suivant fonctionne:

    Bloc 1:
    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
    import win32com.client
    from new import classobj
     
    WithEvents = win32com.client.WithEvents
    Application = win32com.Dispatch("CANalyzer.Application")
    CAPL=Application.CAPL
     
    class MeasEvents:
        def OnInit(self):
            print "Measurement.OnInit()"
            global ref
            ref=CAPL.GetFunction("TEST")
     
    handler = classobj('Handler',(MeasEvents,),{}) # Declaration de la Classe-Objet
     
    Measurement = Application.Measurement
    MeasurementEvents=WithEvents(Measurement,handler)
     
    Application.Open("C:\\Users\\test.cfg")
     
    Measurement.Start()
    Bloc 2:
    Néanmoins, si les deux codes sont insérés dans le même bloc, le code ne fonctionne plus.

    Est-ce dû à une histoire de threads?
    J'ai essayé quelques manips en créant différents threads mais j'ai une erreur dès que je travaille sur un des objets créés.

    Si vous avez une idée de piste pour une solution permettant d'exécuter ce code en python en un seul code je suis preneur.

    En tous cas, merci pour votre aide.

  10. #10
    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
    Je pense effectivement que c'est un problème de concurrence. Et je ne pense pas que classobj soit nécessaire (mais je peux me tromper).
    Peut-être ceci ?
    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
    import win32com.client
    from time import sleep
     
    WithEvents = win32com.client.WithEvents
    Application = win32com.Dispatch("CANalyzer.Application")
    CAPL=Application.CAPL
     
    ref = None
     
    class MeasEvents:
        def OnInit(self):
            print "Measurement.OnInit()"
            global ref
            ref=CAPL.GetFunction("TEST")
     
    Measurement = Application.Measurement
    MeasurementEvents=WithEvents(Measurement,MeasEvents)
     
    Application.Open("C:\\Users\\test.cfg")
     
    Measurement.Start()
     
    while not ref: sleep(0.1)
     
    ref.Call(1)

  11. #11
    Membre averti
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mars 2011
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mars 2011
    Messages : 43
    Par défaut code CAPL
    bonjour à tous
    j'essaye de faire un interface grafique en C++ qui permet de piloter une configuration sous le logiciel CANalyzer à travers un COM server et d'exploiter des fonction CAPL . jusquà mtn jé aucun idéé si quelqun pe maidé par une docs ou bien des info je le remercie en avance
    merci

  12. #12
    Membre averti
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mars 2011
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mars 2011
    Messages : 43
    Par défaut VB.NET recuperation d'evenement
    ,j'ai commencer un projet en VB.NET mais j'arrive pas à appeller les fonction CAPL :

    Dim WithEvents gCanApp As CANalyzer.Application
    Dim WithEvents gCanMeasurement As CANalyzer.Measurement
    Dim gMultiplyFunction As CANalyzer.CAPLFunction
    Dim gMultiplyResult As Integer

    gMultiplyFunction = gCanApp.CAPL.GetFunction("Multiply”)

    gMultiplyResult = gMultiplyFunction.Call (4, 5)

    mais ca marche pas pour moi ca me donne un erreur de ce genre :

    gMultiplyFunction = gCanApp.CAPL.GetFunction("Multiply”):defaillance irrémédiable ( Exception de HRESULT: 0x8000FFFF)

    je vous remercier pour une reponse pour remedier à ce blem
    merci et bonne journé

Discussions similaires

  1. méthode sur l'objet courant?
    Par mathher dans le forum C++
    Réponses: 3
    Dernier message: 31/03/2006, 17h27
  2. Réponses: 2
    Dernier message: 02/02/2006, 23h00
  3. Méthode avec argument objet de la même classe
    Par Black-Ghost dans le forum C++
    Réponses: 5
    Dernier message: 30/01/2006, 10h01
  4. [MFC] Surcharge d'une méthode CListCtrl
    Par semenzato dans le forum MFC
    Réponses: 8
    Dernier message: 22/12/2005, 22h05
  5. Conseils sur la méthode de développement objet métier
    Par RamDevTeam dans le forum Langage
    Réponses: 5
    Dernier message: 08/12/2005, 18h14

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