communication qthread et fenêtre graphique

Le problème exposé dans ce sujet a été résolu.

Bonsoir chères amis je développe une application dans laquelle j’utilise une boucle tantque qui bloque mon interface graphique. J’ai jugé bien d’utiliser un Qthread pour gérer cela. Mon qthread doit envoyer régulièrement des informations a l’interface graphique pour la mise a jour.

Mais le véritable problème je n’arrive pas a faire communiquer mon Qthread avec mon interface graphique. Voici ma classe lancer qui hérite de Qthread.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
class Lancer(QtCore.QThread):
    def __init__(self, liste, plus, duree, parent=None):
        super(Lancer, self).__init__(parent)
        self.liste = liste
        self.plus = plus
        self.duree = duree
        self.fin = None
        self.continuer = False
    def run(self):
        if self.continuer:
            pass
        else:
            self.continuer = True

        self.fin = time.strftime("%H") + str(int(time.strftime("%M")) + int(self.plus)) + time.strftime("%S")
        while time.strftime("%H%M%S") <= fin and self.continuer:
            envoi = self.liste[randrange(len(self.liste))]
            self.emit(QtCore.SIGNAL("demarrer(PyQt_PyObject)"), envoi)
            time.sleep(self.duree)

`

j’ai utilisé self.emit(QtCore.SIGNAL("demarrer(PyQt_PyObject)"), envoi) dans le but d’envoyer la variable envoi a ma fenêtre graphique.

Dans ma fenêtre graphique j’ai définir cette fonction:

1
2
3
4
def demarrer(self):
        start = Lancer(self.liste, self.nbre_min, self.vitesse_pass)
        self.connect(start, QtCore.SIGNAL("recevoir(PyQt_PyObject)"), self.recevoir)
        start.start()

j’ai utilisé self.connect(start, QtCore.SIGNAL("recevoir(PyQt_PyObject)"), self.recevoir) dans le but de recevoir la variable du thread et de lancer la fonction self.recevoir qui est défini comme suite:

1
2
3
4
5
 def recevoir(self, msg):
        self.passa_elt.setText(msg)
        QtCoreQcoreApplication.processEvents()

`

Mais quand je lance le programme voici le résultat:

1
2
self.connect(start, QtCore.SIGNAL("recevoir(PyQt_PyObject)"), self.recevoir)
AttributeError: 'Ui_MainWindow' object has no attribute 'connect'

Pouvez vous m’aider? Merci d’avance.

+0 -0

Salut !

Je ne sais pas si ça peut te servir, et je pense que cette solution est barbare, mais lorsque j’ai rencontré ce problème pour un soft qui n’était pas destiné à être distribué (j’avais des freezes de la GUI + crash de l’exe), j’ai trouvé la fonction QCoreApplication::processEvents() qui m’a permis de faire une update de la GUI en placant l’appel de cette fonction dans ma boucle de traitement … :ninja:

Par contre, je suis sur que ce n’est pas la meilleure solution (je me demande même si ce n’est pas déconseillé d’agir de cette façon), normalement je pense que ça se fait avec du multi-thread. :D

EDIT: Tiens, je suis complètement passé à côté dans ton message mais tu l’as déjà utilisée, je ne connais pas python donc je ne me suis pas attardé sur le code, je laisse ma réponse au besoin. :p

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte