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

PyQt Python Discussion :

comment simulier un clic sur un widget


Sujet :

PyQt Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2017
    Messages : 4
    Points : 1
    Points
    1
    Par défaut comment simulier un clic sur un widget
    Bonjour,
    désolé si je suis pas très clair dans mes explications mais je débute avec python et pyqt5.

    Pour mon boulot je souhaite utiliser un spectromètre sous python, qui utilise obligatoirement (d'après ce que j'ai compris) une interface graphique pour activer la communication, lancer des mesures.... Or, pour effectuer des mesures je ne souhaite pas cliquer à chaque fois sur le bouton "start measurements". Ma question est donc: comment faire pour appeler une fonction liée à un widget sans cliquer sur ce widget? Ou sinon, existe-t-il une commande pour simuler le clic sur un bouton?
    Je joins ci-dessous le code de création de l'interface graphique, ainsi que le code associant à cette interface les fonctions utiles au spectromètre.

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
    from PyQt5 import QtCore, QtGui, QtWidgets
     
    class Ui_MainWindow(object):
        def setupUi(self, MainWindow):
            MainWindow.setObjectName("MainWindow")
            MainWindow.resize(679, 462)
            self.centralwidget = QtWidgets.QWidget(MainWindow)
            self.centralwidget.setObjectName("centralwidget")
            self.OpenCommBtn = QtWidgets.QPushButton(self.centralwidget)
            self.OpenCommBtn.setGeometry(QtCore.QRect(30, 50, 141, 23))
            self.OpenCommBtn.setObjectName("OpenCommBtn")
            self.CloseCommBtn = QtWidgets.QPushButton(self.centralwidget)
            self.CloseCommBtn.setGeometry(QtCore.QRect(30, 90, 141, 23))
            self.CloseCommBtn.setObjectName("CloseCommBtn")
            self.groupBox = QtWidgets.QGroupBox(self.centralwidget)
            self.groupBox.setGeometry(QtCore.QRect(30, 150, 141, 191))
            self.groupBox.setObjectName("groupBox")
            self.IntTimeEdt = QtWidgets.QLineEdit(self.groupBox)
            self.IntTimeEdt.setGeometry(QtCore.QRect(10, 50, 51, 20))
            self.IntTimeEdt.setObjectName("IntTimeEdt")
            self.NumAvgEdt = QtWidgets.QLineEdit(self.groupBox)
            self.NumAvgEdt.setGeometry(QtCore.QRect(10, 100, 51, 20))
            self.NumAvgEdt.setObjectName("NumAvgEdt")
            self.NumMeasEdt = QtWidgets.QLineEdit(self.groupBox)
            self.NumMeasEdt.setGeometry(QtCore.QRect(10, 150, 51, 20))
            self.NumMeasEdt.setObjectName("NumMeasEdt")
            self.label = QtWidgets.QLabel(self.groupBox)
            self.label.setGeometry(QtCore.QRect(10, 30, 111, 16))
            self.label.setObjectName("label")
            self.label_2 = QtWidgets.QLabel(self.groupBox)
            self.label_2.setGeometry(QtCore.QRect(10, 80, 111, 16))
            self.label_2.setObjectName("label_2")
            self.label_3 = QtWidgets.QLabel(self.groupBox)
            self.label_3.setGeometry(QtCore.QRect(10, 130, 131, 16))
            self.label_3.setObjectName("label_3")
            self.StartMeasBtn = QtWidgets.QPushButton(self.centralwidget)
            self.StartMeasBtn.setGeometry(QtCore.QRect(30, 370, 141, 23))
            self.StartMeasBtn.setObjectName("StartMeasBtn")
            self.StopMeasBtn = QtWidgets.QPushButton(self.centralwidget)
            self.StopMeasBtn.setGeometry(QtCore.QRect(30, 410, 141, 23))
            self.StopMeasBtn.setObjectName("StopMeasBtn")
            self.plot = RenderArea(self.centralwidget)
            self.plot.setGeometry(QtCore.QRect(190, 50, 471, 391))
            self.plot.setObjectName("plot")
            MainWindow.setCentralWidget(self.centralwidget)
     
            self.retranslateUi(MainWindow)
            QtCore.QMetaObject.connectSlotsByName(MainWindow)
            MainWindow.setTabOrder(self.OpenCommBtn, self.CloseCommBtn)
            MainWindow.setTabOrder(self.CloseCommBtn, self.IntTimeEdt)
            MainWindow.setTabOrder(self.IntTimeEdt, self.NumAvgEdt)
            MainWindow.setTabOrder(self.NumAvgEdt, self.NumMeasEdt)
            MainWindow.setTabOrder(self.NumMeasEdt, self.StartMeasBtn)
            MainWindow.setTabOrder(self.StartMeasBtn, self.StopMeasBtn)
     
        def retranslateUi(self, MainWindow):
            _translate = QtCore.QCoreApplication.translate
            MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
            self.OpenCommBtn.setText(_translate("MainWindow", "Open Communication"))
            self.CloseCommBtn.setText(_translate("MainWindow", "Close Communication"))
            self.groupBox.setTitle(_translate("MainWindow", "Measurement Parameters"))
            self.label.setText(_translate("MainWindow", "Integration Time [ms]"))
            self.label_2.setText(_translate("MainWindow", "Number of Averages"))
            self.label_3.setText(_translate("MainWindow", "Number of Measurements"))
            self.StartMeasBtn.setText(_translate("MainWindow", "Start Measurements"))
            self.StopMeasBtn.setText(_translate("MainWindow", "Stop Measurements"))
     
    from renderarea import RenderArea
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
    import os
    import platform
    import sys
    import time
    from PyQt5.QtCore import *
    from PyQt5.QtGui import *
    from PyQt5.QtWidgets import *
    from avaspec import *
    import globals
    import form1
     
    class MainWindow(QMainWindow, form1.Ui_MainWindow):
        newdata = pyqtSignal()
        def __init__(self, parent=None):
            QMainWindow.__init__(self, parent)
            self.setupUi(self)
            self.IntTimeEdt.setText("{:3.1f}".format(5.0))
            self.NumAvgEdt.setText("{0:d}".format(1))
            self.NumMeasEdt.setText("{0:d}".format(1))
            self.StartMeasBtn.setEnabled(False)
            self.newdata.connect(self.handle_newdata)
     
        @pyqtSlot()
     
        def on_OpenCommBtn_clicked(self):
            ret = AVS_Init(0)    
            ret = AVS_GetNrOfDevices()
            req = 0
            mylist = AvsIdentityType * 1
            ret = AVS_GetList(75, req, mylist)
            serienummer = str(ret[1].SerialNumber.decode("utf-8"))
            QMessageBox.information(self,"Info","Found Serialnumber: " + serienummer)
            globals.dev_handle = AVS_Activate(ret[1])
            devcon = DeviceConfigType
            reqsize = 0
            ret = AVS_GetParameter(globals.dev_handle, 63484, reqsize, devcon)
            globals.pixels = ret[1].m_Detector_m_NrPixels
            self.StartMeasBtn.setEnabled(True)
            return
     
        @pyqtSlot()
     
        def on_StartMeasBtn_clicked(self):
            measconfig = MeasConfigType
            measconfig.m_StartPixel = 0
            measconfig.m_StopPixel = globals.pixels - 1
            measconfig.m_IntegrationTime = float(self.IntTimeEdt.text())
            measconfig.m_IntegrationDelay = 0
            measconfig.m_NrAverages = int(self.NumAvgEdt.text())
            measconfig.m_CorDynDark_m_Enable = 0  # nesting of types does NOT work!!
            measconfig.m_CorDynDark_m_ForgetPercentage = 0
            measconfig.m_Smoothing_m_SmoothPix = 0
            measconfig.m_Smoothing_m_SmoothModel = 0
            measconfig.m_SaturationDetection = 0
            measconfig.m_Trigger_m_Mode = 0
            measconfig.m_Trigger_m_Source = 0
            measconfig.m_Trigger_m_SourceType = 0
            measconfig.m_Control_m_StrobeControl = 0
            measconfig.m_Control_m_LaserDelay = 0
            measconfig.m_Control_m_LaserWidth = 0
            measconfig.m_Control_m_LaserWaveLength = 0.0
            measconfig.m_Control_m_StoreToRam = 0
            ret = AVS_PrepareMeasure(globals.dev_handle, measconfig)
            nummeas = int(self.NumMeasEdt.text())
            ret = AVS_Measure(globals.dev_handle, int(self.winId()), nummeas)
     
            return
     
    def main():
        app = QApplication(sys.argv)
        app.lastWindowClosed.connect(app.quit)
        app.setApplicationName("PyQt5 simple demo")
        form = MainWindow()
        form.show()
        app.exec_()
    Merci d'avance

  2. #2
    Membre régulier
    Homme Profil pro
    Cocher moderne
    Inscrit en
    Septembre 2006
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Oman

    Informations professionnelles :
    Activité : Cocher moderne

    Informations forums :
    Inscription : Septembre 2006
    Messages : 50
    Points : 118
    Points
    118
    Par défaut
    Bonjour,

    Bien que ne connaissant pas pyQt, il semble (lecture rapide et superficielle) d'après ton code que cela fonctionne à l'aide de fonctions callback qui se déclenchent après appui sur certains boutons (on_OpenCommBtn_clicked() et on_StartMeasBtn_clicked() ). Donc si tu veux lancer ces fonctions sans appuyer sur le bouton, je pense qu'il suffit de les appeler... Non ?

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2017
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Bonjour LandReagan,

    c'est aussi ce que je pensais, malheureusement lorsque j'appelle la fonction on_StartMeasBtn_clicked() qui est censée enregistrer un spectre, je n'obtient qu'un spectre vide (même pas du bruit!). c'est donc que j'ai raté quelque chose, mais quoi? Dans le doute je vais quand même retenté un coup ce matin.

  4. #4
    Membre régulier
    Homme Profil pro
    Cocher moderne
    Inscrit en
    Septembre 2006
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Oman

    Informations professionnelles :
    Activité : Cocher moderne

    Informations forums :
    Inscription : Septembre 2006
    Messages : 50
    Points : 118
    Points
    118
    Par défaut
    Bonjour,

    Est-ce que tu construis correctement l'objet MainWindow avant d'appeler directement la fonction ? Je vois des fonctions de connexion dans son constructeur. Si ce n'est pas le cas, cela expliquerait pourquoi ton script ne se connecte pas au capteur.

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2017
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Bonjour,
    la construction de l'objet MainWindow a été faite par le constructeur du spectromètre, donc normalement cela a été testé (avec succès). De plus si j'utilise leur interface pour réaliser une mesure ponctuelle de test, cela fonctionne correctement. Sauf que je désire automatiser une suite de mesure en lien avec un autre instrument, je ne peux donc utiliser leur interface...
    Merci pour l'attention que tu portes à mon problème.

    Bye

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par sourdingue33 Voir le message
    Sauf que je désire automatiser une suite de mesure en lien avec un autre instrument, je ne peux donc utiliser leur interface...
    Normalement, vos mesures n'ont pas besoin de l'interface graphique.... mais dans votre code, vous avez mélangé l'interface et les mesures. Ca serait mieux de séparer les deux i.e. créer des fonctions qui réalisent les mesures (et qui pourraient être utilisées avec une interface "console") et les appeler depuis l'interface graphique (ou autre).
    note: çà aurait aussi l'avantage de mettre en évidence les informations qui viennent de l'interface graphique des autres.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2017
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Je suis totalement d'accord avec vous sur ce point. Les codes que je vous ais fourni sont ceux du constructeur de l'appareil et sont difficilement lisibles pour le néophyte que je suis. J'ai finalement réussi à zapper l'interface en utilisant une autre fonction de mesure qui n'utilise pas l'interface graphique et me permet d'automatiser ma mesure.
    Merci à vous deux d'avoir jeter un coup d’œil sur ce code.

    Bye

Discussions similaires

  1. comment tracer les clics sur une présentation interactive
    Par JOUEURDEGOLF dans le forum Powerpoint
    Réponses: 3
    Dernier message: 02/01/2017, 10h36
  2. Réponses: 3
    Dernier message: 19/09/2015, 09h27
  3. comment simuler un clic sur un bouton en java
    Par kohan95 dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 28/03/2009, 13h31
  4. comment lancer un clic sur un objet ?
    Par lestat22 dans le forum Flex
    Réponses: 3
    Dernier message: 27/03/2008, 14h52
  5. Comment gérer des clics sur les touches du clavier:
    Par choko83 dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 11/03/2008, 11h15

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