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 ne fonctionne pas (PySide6)


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2019
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2019
    Messages : 48
    Par défaut QTimer ne fonctionne pas (PySide6)
    Bonjour à tous,


    Je suis débutante en Python. Voilà mon souci, j'ai un bouton de soumission désactivé par défaut au lancement du programme. Pour le test, j'essaie de le réactiver au bout de 5 secondes et de changer son style CSS mais rien ne se passe.
    Je n'ai pas d'erreur dans la console. J'ai utilisé une fonction print("Bouton activé") dans mon callback pour essayé de débugger, mais aucun affichage non plus. C'est comme si la méthode activate() de ma classe MyButton n'était pas appelée
    Pourriez vous m'apporter votre aide ?

    Application
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    # Lancement du Timer
    chrono = MyTimer()
    chrono.start()
    MyTimer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    from PySide6.QtCore import QTimer
    from controllers.Btn import MyButton
    
    class MyTimer(MyButton):
        def __init__(self):
            super().__init__()
            self.__reading_time: int = 5000  # 5 secondes
    
        def start(self):
            QTimer.singleShot(self.__reading_time, self.activate)
    MyButton
    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
    from PySide6.QtWidgets import QPushButton
    from PySide6.QtCore import QSize
    
    class MyButton:
        def __init__(self) -> None:
            self.__btn = QPushButton('Soumettre réponses')
            self.__btn.setFixedSize(QSize(400, 48))
            self.__btn.setDisabled(True)
    
        def get(self):
            return self.__btn
    
        def activate(self):
            print("bouton activé")
            self.__btn.setDisabled(False)
            self.__btn.setStyleSheet(
                "padding: 8px; margin-left:100px; background-color:#00af3b; color:white; border:none; font-size:16px")

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 833
    Billets dans le blog
    1
    Par défaut
    Bonjour
    On ne peut pas faire de QWidget (et un QPushButton est un QWidget à la base) sans créer un QApplication. Normalement il te le dit "Must construct a QApplication before a QWidget".
    En réécrivant ton lancement ainsi...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    app=QApplication([])
    chrono = MyTimer()
    chrono.start()
    app.exec()
    ... je vois apparaitre le message "bouton activé" prouvant que la méthode activate() a bien été appelée ce qui prouve par transitivité que le QTimer a bien fonctionné.

    Ici un petit tutoriel de comment on construit une application Qt => https://pyqt.developpez.com/telechar.../47/Hello-Word. Il est écrit pour PyQt6 mais en remplaçant "PyQt6" par "PySide6" ça devrait le faire (les différences sont minimes et ne devraient pas gêner dans ces exemples)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre averti
    Femme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2019
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2019
    Messages : 48
    Par défaut
    Coucou merci pour ta réponse. J'ai résolu le souci en modifiant un peu mon code :

    - Je passe une instance de MyButton en paramètre de MyTimer
    - J'ai rajouté lambda dans mes paramètres singleShot() (si je le supprime ça ne fonctionne pas), par contre j'ai pas l'explication, si tu l'as je suis preneuse

    Application
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    # Bouton de soumission
    submitbtn = MyButton()
     
    # Lancement du Timer en passant l'instance de MyButton
    timer = MyTimer(submitbtn)
    timer.start()
    MyTimer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     def start(self):
            timer = QTimer()
            timer.singleShot(
                self.__reading_time, lambda: self.btn.activate())

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par LO88ra Voir le message
    - J'ai rajouté lambda dans mes paramètres singleShot() (si je le supprime ça ne fonctionne pas), par contre j'ai pas l'explication, si tu l'as je suis preneuse
    Sans code complet...
    En reproduisant ta description chez-moi (le MyTimer qui reçoit une instance de MyButton et le start qui relie un QTimer à la méthode activate du bouton reçu) ça fonctionne

    Code python : 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
    #!/usr/bin/env python3
     
    from PyQt6.QtCore import *
    from PyQt6.QtWidgets import *
     
    class MyButton:
    	def __init__(self) -> None:
    		self.__btn = QPushButton('Soumettre réponses')
    		self.__btn.setFixedSize(QSize(400, 48))
    		self.__btn.setDisabled(True)
     
    	def get(self):
    		return self.__btn
     
    	def activate(self):
    		print("bouton activé")
    		self.__btn.setDisabled(False)
    		self.__btn.setStyleSheet(
    			"padding: 8px; margin-left:100px; background-color:#00af3b; color:white; border:none; font-size:16px"
    		)
     
    class MyTimer(MyButton):
    	def __init__(self, btn):
    		super().__init__()
    		self.__reading_time: int = 5000  # 5 secondes
    		self.__btn=btn
     
    	def start(self):
    		print("start")
    		QTimer.singleShot(self.__reading_time, self.__btn.activate)
     
    app=QApplication([])
    chrono = MyTimer(MyButton())
    chrono.start()
    app.exec()

    Accessoirement, puisque le MyTimer hérite de MyButton, le MyTimer est un MyButton. Je ne vois donc pas pourquoi il devrait recevoir un MyButton en paramètre puisqu'il est lui-même un MyButton !!!

    Code python : 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
    #!/usr/bin/env python3
     
    from PyQt6.QtCore import *
    from PyQt6.QtWidgets import *
     
    class MyButton:
    	def __init__(self) -> None:
    		self.__btn = QPushButton('Soumettre réponses')
    		self.__btn.setFixedSize(QSize(400, 48))
    		self.__btn.setDisabled(True)
     
    	def get(self):
    		return self.__btn
     
    	def activate(self):
    		print("bouton activé")
    		self.__btn.setDisabled(False)
    		self.__btn.setStyleSheet(
    			"padding: 8px; margin-left:100px; background-color:#00af3b; color:white; border:none; font-size:16px"
    		)
     
    class MyTimer(MyButton):
    	def __init__(self):
    		super().__init__()
    		self.__reading_time: int = 5000  # 5 secondes
     
    	def start(self):
    		print("start")
    		QTimer.singleShot(self.__reading_time, self.activate)
     
    app=QApplication([])
    chrono = MyTimer()
    chrono.start()
    app.exec()
    Peut-être faudrait revoir les principes et buts de l'héritage...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Réponses: 6
    Dernier message: 27/01/2004, 11h14
  2. [FP]Writeln ne fonctionne pas !
    Par néo333 dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 01/11/2003, 23h47
  3. UNION qui ne fonctionne pas
    Par r-zo dans le forum Langage SQL
    Réponses: 7
    Dernier message: 21/07/2003, 10h04
  4. Un Hint sur un PopupMenu ne fonctionne pas !!??
    Par momox dans le forum C++Builder
    Réponses: 6
    Dernier message: 26/05/2003, 16h48
  5. ca ne fonctionne pas (generateur auto-incrémentant)
    Par tripper.dim dans le forum SQL
    Réponses: 7
    Dernier message: 26/11/2002, 00h10

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