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 :

Réaliser une action avec un intervalle de temps


Sujet :

PyQt Python

  1. #1
    Membre éprouvé
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Points : 982
    Points
    982
    Par défaut Réaliser une action avec un intervalle de temps
    Bonjour

    J'ai une application pyqt qui fonctionne et que je souhaiterais améliorer. J'aimerai après un clic sur un bouton appeler une fonction qui va réaliser une action par exemple toutes les 15 min !

    Pour ce qui est de créer le bouton la fenêtre et appeler la fonction je sais faire, par contre je n'ai aucune idée de comment on peut gérer le temps ou une action qui va se répéter d'elle même.

    Merci pour votre aide

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 313
    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 313
    Points : 36 819
    Points
    36 819
    Par défaut
    Salut,
    Qt est un "gros" framework.
    Regardez les classes Qthread et QTimer
    - W

  3. #3
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 478
    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 478
    Points : 9 280
    Points
    9 280
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Voilà un petit code (python 2.7) qui montre comment on peut utiliser QTimer.

    C'est une petite fenêtre avec une zone d'affichage et 2 boutons: un pour lancer le timer, et un pour l'arrêter.

    A chaque top du timer, on incrémente et on affiche la valeur du compteur dans la zone d'affichage.

    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
     
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    from __future__ import division
    # python 2.7
     
    import sys
     
    from PyQt4 import QtCore, QtGui
     
    ##################################################
    class Fenetre(QtGui.QWidget):
     
        #====================================================
        def __init__(self, parent=None):
            super(Fenetre,self).__init__(parent)
     
            self.edit_w = QtGui.QLineEdit(self)
            self.envoyez_b = QtGui.QPushButton(u"Démarrer", self)
            self.arreter_b = QtGui.QPushButton(u"Arrêter", self)
     
            self.envoyez_b.clicked.connect(self.envoyez_m)
            self.arreter_b.clicked.connect(self.arreter_m)
     
            posit = QtGui.QGridLayout()
            posit.addWidget(self.edit_w, 0, 0)
            posit.addWidget(self.envoyez_b, 1, 0)
            posit.addWidget(self.arreter_b, 2, 0)
            self.setLayout(posit)        
     
        #====================================================
        def action_m(self):
            self.compteur += 1 
            self.edit_w.setText(unicode(self.compteur))
     
        #====================================================
        def envoyez_m(self):
            self.edit_w.setText(u"") # effacer la zone d'affichage
            self.compteur = 0 # compteur seulement pour l'affichage
     
            self.timer = QtCore.QTimer()
            self.timer.start(1000) # lancer un top toutes les secondes (=1000 millisecondes)
            self.connect(self.timer, QtCore.SIGNAL("timeout()"), self.action_m)
     
        #====================================================
        def arreter_m(self):
            if self.timer.isActive(): 
                self.timer.stop()
            self.edit_w.setText(u"Arrêt demandé")
     
        #====================================================
        def closeEvent(self, event):
            self.arreter_m()
            event.accept()
     
    ##################################################
    if __name__ == "__main__":
        app = QtGui.QApplication(sys.argv)
        fen = Fenetre()
        fen.show()
        sys.exit(app.exec_())
    La solution avec QThread marche aussi, mais sa mise en œuvre est un peu plus compliquée pour résoudre le problème posé. Il faut cependant se rappeler qu'il ne faut pas accéder directement aux objets graphiques à partir d'un thread: la communication doit se faire uniquement avec des signaux (emit - connect).

    Tyrtamos

  4. #4
    Membre éprouvé
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Points : 982
    Points
    982
    Par défaut
    Merci.

    Ton code est parfait, je vais pouvoir travailler dessus pour faire ce que je veux.

    Je ne connaissais pas la syntaxe que tu utilises pour connecter les SLOT() et les SINALS().

    Moi j'utilise une syntaxe plus de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
           self.connect( exit, SIGNAL("triggered()"), qApp, SLOT("quit()") )
     
           apropos = QAction(u"À propos", self)
           self.connect( apropos, SIGNAL("triggered()"), self.showAPropos)
    où exit et apropos sont des actions dans une QToolBar et ici self est une QMainWindow.

    Qu'elle est la syntaxe qu'il est préférable d'utiliser (j'ai appris PyQt via un tuto Qt C++ ...). J'ai entendu parlé d'une nouvelle syntaxe pour les signaux en pyqt, c'est celle que tu utilises ?

  5. #5
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 301
    Points : 6 781
    Points
    6 781
    Par défaut
    J'ajouterai que tu as aussi un module python tout fait pour ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    from threading import Timer
     
    def tempo():
        t = Timer(900, next_action)
        t.start()
    Timer prend deux arguments : le temps en secondes, et la fonction a appeler lors que le temps est écoulé.

    Même remarque, si next_action doit manipuler une pixmap, il faudra intercaler un signal, sous Linux en tous cas.

  6. #6
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 478
    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 478
    Points : 9 280
    Points
    9 280
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Citation Envoyé par Ladgalen Voir le message
    Qu'elle est la syntaxe qu'il est préférable d'utiliser (j'ai appris PyQt via un tuto Qt C++ ...). J'ai entendu parlé d'une nouvelle syntaxe pour les signaux en pyqt, c'est celle que tu utilises ?
    J'ai choisi la syntaxe la plus simple parmi toutes celles que j'ai vues ici ou là. Il est possible qu'on gagne quelque chose avec la syntaxe plus complète, (rapidité?), mais pour l'instant, c'est assez compliqué comme ça... Je sais qu'il y a des spécificités PyQt4, mais je n'ai pas encore creusé (http://www.riverbankcomputing.co.uk/...4ref.html#id58).

    Sinon, j'ai déjà pu vérifier que le module threading de Python (et donc timer) fonctionnait avec PyQt4, mais puisqu'il existe des versions spécifiques à QT, je trouve plus prudent de les utiliser. En tout cas, je n'ai trouvé aucun dysfonctionnement avec threading.

    Tyrtamos

    edit: cependant, j'ai déjà utilisé des signaux spécifiques à PyQt4 ici: http://python.jpvweb.com/mesrecettes...netres_2_pyqt4 (récemment transporté sur developpez http://pyqt.developpez.com/tutoriels...uperer-valeur/).

Discussions similaires

  1. repeter une action avec un timer
    Par blondelle dans le forum C++Builder
    Réponses: 30
    Dernier message: 24/10/2008, 01h25
  2. Réponses: 5
    Dernier message: 04/07/2006, 10h55
  3. Déclencher une action avec un chrono
    Par Oberown dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 20/09/2005, 14h22
  4. [JTextField] Déclencher une action avec la touche ENTER
    Par tchoukapi dans le forum Composants
    Réponses: 10
    Dernier message: 19/09/2005, 14h37
  5. Réponses: 4
    Dernier message: 27/04/2004, 14h45

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