Как встроить терминал в приложение PyQt5 без QProcess? - PullRequest
0 голосов
/ 11 сентября 2018

В последнее время я боролся за встраивание терминала в приложение PyQt GUI.Пробовал почти каждый поиск в интернете, но ничто не похоже на какую-либо помощь.

У меня есть QTabWidget, и мне просто нужна одна вкладка, чтобы иметь терминал.

Разве это вообще невозможно сделать?

Нет ли что-то вроде QTabWidget.Tab2.show(terminal-app), и на вкладке 2 отображается терминал по умолчанию, и все функции, такие как ls, ifconfig, cd и т. Д., Работают нормально?

PS - Я уже пробовал это, но безуспешно. Встраивание терминала в PyQt5

(здесь преобразован код из PyQt4 в PyQt5, но это не соответствует моим потребностям) как использовать терминал, встроенный в графический интерфейс PyQt

TIA

Ответы [ 2 ]

0 голосов
/ 04 января 2019

У меня была такая же проблема в течение нескольких месяцев, и решение urxvt или xterm не решило ее для меня, поэтому я создал репо, где я работаю над легко встраиваемым терминалом для PyQt5.Он работает для некоторых команд, но для таких команд, как python, у него просто проблемы с записью в такой запущенный процесс.

Не стесняйтесь вносить свой вклад!https://github.com/Fuchsiaff/PyQtTerminal

0 голосов
/ 11 сентября 2018

краткий ответ: Qt5 не предусматривает использование терминала, поэтому вам придется использовать QProcess.

TL; DR

Класс EmbTerminal, предлагаемый в качестве решения, является виджетом, поэтому вы должны добавить его с addTab(), имейте в виду, что у вас установлен терминал urxvt (если вы хотите проверить установку, запустите urxvt в терминале)

import sys
from PyQt5 import QtCore, QtWidgets


class EmbTerminal(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(EmbTerminal, self).__init__(parent)
        self.process = QtCore.QProcess(self)
        self.terminal = QtWidgets.QWidget(self)
        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(self.terminal)
        # Works also with urxvt:
        self.process.start('urxvt',['-embed', str(int(self.winId()))])
        self.setFixedSize(640, 480)


class mainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(mainWindow, self).__init__(parent)

        central_widget = QtWidgets.QWidget()
        lay = QtWidgets.QVBoxLayout(central_widget)
        self.setCentralWidget(central_widget)

        tab_widget = QtWidgets.QTabWidget()
        lay.addWidget(tab_widget)

        tab_widget.addTab(EmbTerminal(), "EmbTerminal")
        tab_widget.addTab(QtWidgets.QTextEdit(), "QTextEdit")
        tab_widget.addTab(QtWidgets.QMdiArea(), "QMdiArea")


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    main = mainWindow()
    main.show()
    sys.exit(app.exec_())
...