Как встроить терминал в приложение PyQt5 без QProcess?
В последнее время я боролся с встраиванием терминала в приложение PyQt GUI. Пробовал почти каждый поиск в интернете, но ничто не похоже на какую-либо помощь.
У меня есть QTabWidget, и мне просто нужна одна вкладка, чтобы иметь терминал.
Разве это вообще невозможно сделать?
Нет ли что-то вроде QTabWidget.Tab2.show(terminal-app)
и терминал по умолчанию отображается в tab2 и каждая функция, как ls
, ifconfig
, cd
и тп работает нормально?
PS - я уже пробовал это, но безуспешно. Встраивание терминала в PyQt5
(здесь преобразован код из PyQt4 в PyQt5, но это не соответствует моим потребностям), как использовать терминал, встроенный в графический интерфейс PyQt
ТИА
1 ответ
краткий ответ: 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_())
У меня была такая же проблема в течение нескольких месяцев, и решение urxvt или xterm мне не помогло, поэтому я создал репозиторий, где я работаю над легко встраиваемым терминалом для PyQt5. Это работает для некоторых команд, но для таких команд, как python
у него просто проблемы с записью в такой запущенный процесс.
Не стесняйтесь вносить свой вклад! https://github.com/Fuchsiaff/PyQtTerminal