2016-04-29 7 views
0

Я использовал QtDesigner сделать мастер и преобразовал файл .ui с помощью pyuic4.Как перенаправить вывод нескольких алфавитов в QTextBrowser с помощью PyQt4

Этот мастер имеет несколько страниц. На одной из страниц есть флажки. Флажки используются для выбора определенных скриптов python для запуска.

Мой вопрос как я должен идти о вызове выбранной скрипты один за другим, а после этого, перенаправив вывод в реальном времени к QTextBrowser виджета в любой из последующих страниц (ы) мастера.

Наконец, во время работы скриптов есть возможность временно отключить следующие кнопки и кнопки.?

ответ

0

Использовать QThread, чтобы избежать зависания пользовательского интерфейса; запускать скрипты в потоке с помощью subprocess.Popen с stdout=PIPE, читать свои строки по строкам, emit строк и получать их в любом slot.

from PyQt4.QtGui import QTextBrowser, QApplication 
from PyQt4.QtCore import pyqtSignal, QThread 
from subprocess import Popen, PIPE 
from Queue import Queue 
from threading import Event 

class ScriptRunner(QThread): 
    # fired whenever a line from subprocess.stdout arrived 
    got_line = pyqtSignal(unicode) 

    def __init__(self): 
     QThread.__init__(self) 
     self.queue = Queue() 
     self.put = self.queue.put 
     self.stop_event = Event() 
     self.start() 

    def run(self): 
     """thread function""" 
     while 1: 
      script = self.queue.get() 
      if script is None: # no more scripts 
       break 
      # run the script 
      proc = Popen(script, bufsize=1, stdout=PIPE, shell=True, 
         universal_newlines=True) 
      # read its output line by line 
      while not self.stop_event.is_set(): 
       line = proc.stdout.readline() 
       if not line: 
        break 
       self.got_line.emit(line) 

    def join(self): 
     self.stop_event.set() 
     self.put(None) 
     self.wait() 

if __name__ == '__main__': 
    app = QApplication([]) 
    text_browser = QTextBrowser() 
    text_browser.show() 

    runner = ScriptRunner() 
    # connect to got_line signal 
    runner.got_line.connect(text_browser.insertPlainText) 

    # schedule a script 
    runner.put('''python -c "for i in range(25): print 'dada'; import time; time.sleep(.25)"''') 
    # now force python to flush its stdout; note -u switch 
    runner.put('''python -uc "for i in range(25): print 'haha'; import time; time.sleep(.25)"''') 

    app.exec_() 
    runner.join() 

Однако обратите внимание, что из-за буферизации вывода сценариев может прийти в большие куски, делает его трудно достичь плавности в реальном времени, как в терминале. С помощью python вы можете обойти это, передав -u переход на интерпретатор (а не на скрипт).