2017-10-14 16 views
0

J'ai créé un widget QPushButton et un widget QTextEdit, et ce que je veux, c'est qu'une fois que je clique sur le bouton, le système exécute un programme externe, et le journal de sortie Widget QTextEdit.Impossible de sortir le journal en temps réel dans un emplacement pyqt

Le problème est que le journal ne peut pas être continuellement envoyé au widget QTextEdit. Il est envoyé en une fois après le programme externe effectué. Pourquoi?

Ceci est mon code:

class Window(Qwidget): 
    def __init__(self, parent=None): 
     ... 
     self.button.clicked.connect(self.onStart) 
     ... 
    def onStart(self): 
     # keep sending log in this solt, similar to my external program 
     for i in range(10000): 
      self.logger.debug(str(i)) 

Et je l'ai déjà rediriger self.logger.debug() à sys.stdout, et le journal de sortie à un widget QTextEdit dans un thread.

class myThread(QThread): 
    printText = pyqtSignal(str) 

    def __init__(self, parent=None): 
     super(myThread,self).__init__(parent) 

    def write(self, output): 
     self.printText.emit(output) 

    def flush(self): 
     pass 

    def run(self): 
     while True: 
      time.sleep(.1) 

Lorsque je clique sur le bouton, pyqt se coincer dans la boucle for i in range(10000) et rien d'affichage. Après quelques secondes, tous les journaux de sortie s'affichent en une seule fois et s'affichent en temps réel.

+0

Il n'y a rien dans votre exemple de code qui s'exécute dans un thread séparé - tout s'exécute dans le thread principal, et donc bloque la boucle d'événements principale. – ekhumoro

Répondre

0

Comme la suggestion de ekhumoro, je mets la boucle dans un fil:

def onStart(self): 
    _thread.start_new_thread(self.myLoop,()) 
def myLoop(self): 
    for i in range(10000): 
     self.logger.debug(i) 

Module _thread répond à mes besoins fonctionnels et fonctionne bien ici. Si votre besoin de communiquer avec d'autres threads dans myLoop(), threading et queue sont plus puissants.