Перенаправление stdout и stderr в PyQt4 QTextEdit из вторичного потока

Переполнение стека. Еще раз, я прихожу к вам во время острой нужды, шатаясь шатаясь на граниневменяемость, Этот вопрос, как видно из названия, представляет собой объединение нескольких других вопросов, ответы на которые я видел здесь.

У меня есть приложение PyQt, и я хочу перенаправить потоки stdout и stderr в QTextEdit, который находится в моем GUIбез задержки.

Первоначально я нашел следующий ответ переполнения стека: https://stackoverflow.com/a/17145093/629404

Это работает отлично, но с одной оговоркой: если stdout или stderr обновляются несколько раз, пока процессор обрабатывает относительно более длинный метод,все обновления отображаются одновременно, когда основной поток возвращается в цикл приложения., К сожалению, у меня есть несколько методов, выполнение которых занимает до 20 секунд (связанных с сетью), и поэтому приложение перестает отвечать на запросы - и QTextEdit не обновляется - пока они не будут завершены.

Чтобы решить эту проблему,Я делегировал всю обработку GUI основному потоку, и я порождаю второй поток для обработки более длительных сетевых операций, используя pyqtSignals, чтобы уведомить основной поток о том, когда работа закончена, и передать результаты. Сразу же, когда я начал тестировать код, написанный таким образом, интерпретатор python начал аварийно завершать работу.

Вот где это очень раздражает: Python падает, потому что - используя класс из включенной ссылки выше - я назначил потоки sys.stdout / err виджету QTextEdit;Виджеты PyQt не могут быть изменены из какого-либо потока, кроме потока приложения, и поскольку обновления stdout и stderr поступают из созданного мной дополнительного рабочего потока, они нарушают это правило. Я закомментировал раздел кода, куда я перенаправляю выходные потоки, и, конечно же, программа работает без ошибок.

Это возвращает меня к исходной точке и оставляет меня в запутанной ситуации; Предполагая, что я продолжаю обрабатывать связанные с графическим интерфейсом операции в главном потоке и иметь дело с вычислениями и более длинными операциями во вторичном потоке (что, как я понял, является лучшим способом предотвратить блокировку приложения, когда пользователь вызывает события), как я могу это сделать? перенаправить Stdout и Stderr из обоих потоков в виджет QTextEdit? Класс в приведенной выше ссылке прекрасно работает для основного потока, но убивает python - по причине, описанной выше - когда обновления приходят из второго потока.

Ответы на вопрос(1)

Ваш ответ на вопрос