2012-01-19 2 views
3

Я работал с кучей примеров I Googled и смотрел на кучу вопросов о потоковом использовании здесь, в stackoverflow, но я все еще не могу его получить.Python/PyQt/Qt Threading: Как распечатать stdout/stderr сразу?

Вот некоторые примеры кода я работаю с:

class Debugger(QTextBrowser): 
    def __init__(self, parent): 
     super(Debugger, self).__init__(parent) 
     sys.stdout = self 

    def write(self, text): 
     self.moveCursor(QTextCursor.End) 
     self.textCursor().insertText(text) 

В принципе, я пытаюсь поймать каких-либо заявлений «Печать» или другие формы записи в stdoutstream. Но я не могу заставить его печатать их один за другим по мере их поступления. Вместо этого он ждет, пока какой-либо процесс, который печатает строки, не будет завершен, а затем начнет регистрировать информацию. Итак, как мне это правильно нарисовать?

Редактировать: Уменьшенный код до минимума.

+0

Я не уверен, но я подозреваю, что здесь происходит то, что 'write' to 'STDOUT' или что-то еще записано в примечании, пока поток не будет' flush() 'd. В этом случае, если ваш собственный код выполняет запись, убедитесь, что вы вызываете 'flush()' в потоке, как только вы пишете на него, если это код клиента, вам просто нужно подождать. – snim2

+0

Это не проблема. Я попробовал следующее: 1) добавил 'self.oldstdout = sys.stdout' в' Debugger .__ init' 2) добавил 'self.console.oldstdout.write (text)' в 'StdoutStream.write'. И это произошло: пульт python сразу напечатал строки, но отладчик QTextBrowser дождался завершения всего процесса. – Jeff

+0

Возможный дубликат http://stackoverflow.com/questions/2859256/how-to-redirect-a-python-console-output-to-a-qtextbox – synthesizerpatel

ответ

0

Я подозреваю, что вы используете все это в одном потоке?

В то время как другой код работает, mainloop Qt не запускается, поэтому он не обрабатывает события (рисунок на экране, ввод ввода и т. Д.). Поэтому, когда текстовое поле внутренне обновляется, оно не отображается на экране, пока ваша задача не завершится, а затем окно будет перерисовано.

Лучшим решением является запуск процесса, который выполняет вывод (и занимает некоторое время) в отдельном потоке.

Быстрое n-грязное решение состоит в том, чтобы вручную перебирать Qt mainloop всякий раз, когда вы что-то написали в текстовое поле, см. IPython iterate main loop manually?.

Смежные вопросы