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 :

QTimer et répétitions


Sujet :

PyQt Python

  1. #1
    Invité
    Invité(e)
    Par défaut QTimer et répétitions
    Bonjour,
    j'utilise le code suivant pour faire des boucles de mesures.
    Ici je simule la mesure avec un petit "random" mais le problème qui me préoccupe reste inchangé:

    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
        def aquisition(self):
            self.timer = QTimer()                                                #déclaration du timer
            self.debut=time.time()
            self.timer.timeout.connect(self.update1)
            self.timer.setInterval(20)
            self.timer.start(20)
     
        def update1(self):
     
            self.temps_passe=time.time()-self.debut+self.cumul
            self.liste = 10*random.random()
     
            self.x.append(self.temps_passe)
            self.y.append(float(self.liste))
     
            self.temps_ecoule=time.time()-self.debut
            self.nb_mesures=self.nb_mesures+1
    Le code semble bien tourner...
    puisque quand mets "10" (dans le setInterval et le start du Timer) j’obtiens bien 100 opérations par secondes (1000/10).
    idem lorsque je mets "250", j'obtiens bien 4 mesures par seconde (1000/250)

    Mais quand je mets 20 (par exemple)... j'obtiens 160 valeurs par seconde...
    comment cela se fait??? Il semble que tout se passe bien quand je demande à aller plus vite ou plus lentement mais pour des valeurs intermédiaires... ça ne marche pas correctement...

    Y a-t-il une explication?
    merci :-)

  2. #2
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Ça a l'air de fonctionner chez moi. Voilà mon programme de test:

    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
    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
     
    import sys
    from time import time
    from PyQt5 import QtWidgets, QtCore
     
    #############################################################################
    class Fenetre(QtWidgets.QWidget):
     
        def __init__(self, parent=None):
            super().__init__(parent)
     
            self.edit = QtWidgets.QLineEdit(self)
     
            self.boutonEnvoyez = QtWidgets.QPushButton("Démarrer", self)
            self.boutonEnvoyez.clicked.connect(self.demarrer)
     
            self.boutonArreter = QtWidgets.QPushButton("Arrêter", self)
            self.boutonArreter.clicked.connect(self.arreter)
     
            posit = QtWidgets.QGridLayout()
            posit.addWidget(self.edit, 0, 0)
            posit.addWidget(self.boutonEnvoyez, 1, 0)
            posit.addWidget(self.boutonArreter, 2, 0)
            self.setLayout(posit)
     
            self.timer = None
     
        def action(self):
            self.compteur += 1
            self.edit.setText(str(self.compteur))
     
            if time()-self.temps > 1:
                print(self.compteur, self.temps)
                self.temps = time()
     
        def demarrer(self):
            self.edit.setText("") # effacer la zone d'affichage
            self.compteur = 0 # compteur seulement pour l'affichage
     
            self.timer = QtCore.QTimer()
            self.timer.setTimerType(QtCore.Qt.PreciseTimer)
            self.timer.setInterval(20)
            self.timer.timeout.connect(self.action)
     
            self.temps = time()
     
            self.timer.start() # lance le timer
     
        def arreter(self):
            if self.timer!=None and self.timer.isActive():
                self.timer.stop()
            self.edit.setText("Arrêt demandé")
     
        def closeEvent(self, event):
            self.arreter()
            event.accept()
     
    #############################################################################
    if __name__ == "__main__":
        app = QtWidgets.QApplication(sys.argv)
        fen = Fenetre()
        fen.show()
        sys.exit(app.exec_())
    Lancé dans une console, l'affichage donne, pour un intervalle de 20ms, la valeur du compteur à chaque seconde écoulée de l'horloge du PC, ainsi que le time():

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    50 1552895213.273858
    100 1552895214.2743363
    151 1552895215.2747686
    201 1552895216.2941387
    252 1552895217.2945628
    302 1552895218.3140113
    352 1552895219.3144355
    403 1552895220.3147922
    453 1552895221.3342125
    504 1552895222.3346987
    554 1552895223.3540447
    605 1552895224.354471
    Et ça marche même pour un intervalle de 1ms:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    997 1552895367.777933
    1990 1552895368.7784057
    2991 1552895369.778823
    3964 1552895370.7792513
    4965 1552895371.7796772
    5958 1552895372.780098
    6953 1552895373.780523
    7951 1552895374.7809482
    8943 1552895375.7813733
    9944 1552895376.7817914
    10931 1552895377.782221
    A noter que dans ton code, il n'est pas utile de répéter la durée de l'intervalle dans setInterval et dans start: setInterval suffit. Et la précision "QtCore.Qt.PreciseTimer" peut être utile pour certains PC.

    La doc de QTimer est ici: https://doc.qt.io/qt-5/qtimer.html.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Merci pour la réponse,
    en effet ça marche nickel en ajoutant la ligne suivante à la suite du setinterval:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.timer.setTimerType(Qt.PreciseTimer)
    merci beaucoup pour le conseil

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 04/02/2005, 11h03
  2. Répétition de données identiques...
    Par Regis.C dans le forum XML/XSL et SOAP
    Réponses: 6
    Dernier message: 15/04/2004, 21h46
  3. Stopper la répétition du clavier
    Par Chris89 dans le forum Assembleur
    Réponses: 6
    Dernier message: 17/10/2003, 20h53
  4. bouttons à répétition
    Par shumy dans le forum C++Builder
    Réponses: 3
    Dernier message: 26/10/2002, 18h16

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