Ищем PyQt4 встраиваемый виджет терминала - PullRequest
3 голосов
/ 15 декабря 2010

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

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

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

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

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

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

Ответы [ 2 ]

4 голосов
/ 07 февраля 2013

Помогает ли что-то подобное?

#!/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_())
0 голосов
/ 15 декабря 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...