Ищем встраиваемый виджет терминала PyQt4

Я написал приложение, которое, среди прочего, запускает некоторые «бэкэнд»-процессы для выполнения некоторых действий. Эти подпроцессы с большой долей вероятности могут дать сбой или вести себя непредвиденно, поскольку им приходится работать в довольно тяжелых условиях, поэтому я предпочитаю отдавать полный контроль над ними оператору.

ПРИМЕЧАНИЕ. Я запускаю эти процессы, используя класс на основе модуля subprocess вместо QProcess, чтобы иметь дополнительные функции контроля над запущенным процессом.

На данный момент я использую виджет QPlainTextEdit, к которому я добавляю стандартный вывод/ошибку из подпроцесса, а также несколько кнопок для быстрой отправки некоторых общих сигналов (INT, STOP, CONT, KILL, ..), но:

  • В некоторых случаях было бы полезно также отправить некоторые данные. Хотя это можно было бы сделать с помощью поля ввода текста, я бы предпочел использовать что-то более «профессиональное».
  • Конечно, нет прямого способа интерпретировать специальные управляющие символы, такие как цветовые коды, движение курсора и т. д.
  • Мне пришлось реализовать управление автоматической прокруткой консоли, но это не гарантирует 100% хорошую работу (иногда блокировка прокрутки не работает должным образом и т. д.)

Итак: кто-нибудь знает что-то, что я мог бы использовать для удовлетворения этих потребностей?

Я нашел qtermwidget, но он кажется более ориентированным на обработку процесса оболочки (и привязки Python, похоже, позволяют запускать /bin/bash только) сам по себе, чем связь с уже существующим вводом-выводом процесса.


person redShadow    schedule 15.12.2010    source источник
comment
@gruszczy: почему ты сменил тэг с pyqt4 на pyqt? Это два очень разных модуля Python, так как pyqt был привязкой для старого Qt3, а PyQt4, конечно, для Qt4.   -  person redShadow    schedule 18.02.2011


Ответы (2)


Что-то вроде этого помогает?

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import  sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *

class embterminal(QWidget):

    def __init__(self):
        QWidget.__init__(self)
        self.process = QProcess(self)
        self.terminal = QWidget(self)
        layout = QVBoxLayout(self)
        layout.addWidget(self.terminal)
        self.process.start(
                'xterm',['-into', str(self.terminal.winId())])
        # Works also with urxvt:
        #self.process.start(
                #'urxvt',['-embed', str(self.terminal.winId())])

if __name__ == "__main__":
    app = QApplication(sys.argv)
    main = embterminal()
    main.show()
    sys.exit(app.exec_())
person student    schedule 07.02.2013
comment
Круто, я не знал, что это можно сделать ... он все еще нуждается в некоторой настройке (например, счетчик строк внутри терминала неверен), но в целом, похоже, работает нормально ... - person redShadow; 08.02.2013
comment
Возможно, вы что-то знаете о коммуникационной части и можете помочь мне с соответствующим вопросом: stackoverflow.com/q/14772138/406686 - person student; 08.02.2013
comment
Можно ли читать переменные среды в приложении python для отображения информации вместо того, чтобы каждый раз вводить команду echo? - person Ciasto piekarz; 19.08.2014
comment
Проблема с xterm заключается во внешнем виде. Внешний вид Xterm действительно плохой. - person dexterous; 14.10.2015

Вы можете попробовать QConsole (http://qconsole.sourceforge.net/). Я не использовал его, но похоже, что вы ищете.

person Optimal Cynic    schedule 15.12.2010
comment
Я только что попробовал, но, похоже, это не так круто, как обещает описание. Я смог скомпилировать только автономный пример и не нашел инструкции о том, как собрать модуль Python. Кроме того, сам пример кажется довольно глючным, по крайней мере, при компиляции с Qt4 (который будет использовать q3support, как указано на странице проекта..). Я предполагаю, что проект больше ориентирован на реализацию TCL, чем на Python. - person redShadow; 15.12.2010
comment
Это позор. Других я не знаю, к сожалению. - person Optimal Cynic; 16.12.2010