如何在没有 QProcess 的情况下将终端嵌入到 PyQt5 应用程序中?
How to embed terminal inside PyQt5 application without QProcess?
我最近一直在努力将终端嵌入到 PyQt GUI 应用程序中。几乎尝试了互联网上的所有搜索,但似乎没有任何帮助。
我有一个 QTabWidget,我只需要一个选项卡就可以拥有一个终端。
完全不可能这样做吗?
难道没有 QTabWidget.Tab2.show(terminal-app)
之类的东西,默认终端显示在 tab2 中,并且 ls
、ifconfig
、cd
等每个功能都可以正常工作吗?
P.S - 我已经尝试过这些但没有成功。
(将此处的代码从 PyQt4 转换为 PyQt5,但这不能满足我的需求)
T.I.A
简答:Qt5不提供终端的使用,所以你将不得不使用QProcess。
TL;DR
作为解决方案提出的 EmbTerminal class 是一个小部件,因此您必须使用 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 解决方案不适合我,所以我创建了一个 repo,我正在为 PyQt5 开发一个易于嵌入的终端。
它适用于某些命令,但对于像 python
这样的命令,它在写入 运行 进程时遇到问题。
我最近一直在努力将终端嵌入到 PyQt GUI 应用程序中。几乎尝试了互联网上的所有搜索,但似乎没有任何帮助。
我有一个 QTabWidget,我只需要一个选项卡就可以拥有一个终端。
完全不可能这样做吗?
难道没有 QTabWidget.Tab2.show(terminal-app)
之类的东西,默认终端显示在 tab2 中,并且 ls
、ifconfig
、cd
等每个功能都可以正常工作吗?
P.S - 我已经尝试过这些但没有成功。
(将此处的代码从 PyQt4 转换为 PyQt5,但这不能满足我的需求)
T.I.A
简答:Qt5不提供终端的使用,所以你将不得不使用QProcess。
TL;DR
作为解决方案提出的 EmbTerminal class 是一个小部件,因此您必须使用 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 解决方案不适合我,所以我创建了一个 repo,我正在为 PyQt5 开发一个易于嵌入的终端。
它适用于某些命令,但对于像 python
这样的命令,它在写入 运行 进程时遇到问题。