【问题标题】:PyQT terminal emulatorPyQT 终端模拟器
【发布时间】:2020-06-12 17:10:00
【问题描述】:

我正在尝试在 pyqt 中开发一个“控制台”。与所有控制台所在的 xterm.js 类似,前端它不会产生任何子进程,它只是一个 I/O,我可以在以后插入任何我想要的东西。

是否有任何现有的 python 包或简单的小部件可以让我在我的 pyqt 应用程序中放置一个类似终端的界面?

它是一个客户端服务器应用程序,因此终端用于向后端服务器发送命令并检索输出,就好像它是一个 bash shell(例如)

【问题讨论】:

  • 使用 QTermWidget
  • @eyllanesc 谢谢我现在正在调查这个;你有任何文件可以链接我吗?我有时间找到一个很好的例子?? qconsole 和 qtermwidget5-data 已安装,但不知道如何使用它们
  • 那么你已经成功安装了qtermwidget,据我了解,你想向伪终端写一个命令,当你按下回车键时它被发送到服务器,服务器响应应该是反映在终端上,我说的对吗?
  • @eyllanesc 后端是 pty(全部完成)我只想将我的数据从 pty 传输到客户端(已经完成),现在我什至不知道如何编码或调用小部件python,所以我可以在 pyqt 中显示数据,因为没有此小部件的示例或文档:((我可以找到)
  • 看我的回答......

标签: python pyqt pyqt5 python-3.8


【解决方案1】:

你可以使用QTermWidget(如果你不能安装它并且你使用的是ubuntu那么你可以检查this answer)。

例如官方RemoteTerm example允许通过套接字远程访问shell的翻译如下:

terminal.py

import os
import sys

from PyQt5 import QtCore, QtWidgets, QtNetwork

import QTermWidget


class RemoteTerm(QTermWidget.QTermWidget):
    def __init__(self, ipaddr, port, parent=None):
        super().__init__(0, parent)

        self.socket = QtNetwork.QTcpSocket(self)

        self.socket.error.connect(self.atError)
        self.socket.readyRead.connect(self.on_readyRead)
        self.sendData.connect(self.socket.write)

        self.startTerminalTeletype()
        self.socket.connectToHost(ipaddr, port)

    @QtCore.pyqtSlot()
    def on_readyRead(self):
        data = self.socket.readAll().data()
        os.write(self.getPtySlaveFd(), data)

    @QtCore.pyqtSlot()
    def atError(self):
        print(self.socket.errorString())


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)

    QtCore.QCoreApplication.setApplicationName("QTermWidget Test")
    QtCore.QCoreApplication.setApplicationVersion("1.0")

    parser = QtCore.QCommandLineParser()
    parser.addHelpOption()
    parser.addVersionOption()
    parser.setApplicationDescription(
        "Example(client-side) for remote terminal of QTermWidget"
    )
    parser.addPositionalArgument("ipaddr", "adrress of host")
    parser.addPositionalArgument("port", "port of host")

    parser.process(QtCore.QCoreApplication.arguments())

    requiredArguments = parser.positionalArguments()
    if len(requiredArguments) != 2:
        parser.showHelp(1)
        sys.exit(-1)

    address, port = requiredArguments
    w = RemoteTerm(QtNetwork.QHostAddress(address), int(port))
    w.resize(640, 480)
    w.show()
    sys.exit(app.exec_())

shell-srv.py

#!/usr/bin/env python

import sys
import os
import socket
import pty


def usage(program):
    print("Example(server-side) for remote terminal of QTermWidget.")
    print("Usage: %s ipaddr port" % program)


def main():
    if len(sys.argv) != 3:
        usage(sys.argv[0])
        sys.exit(1)
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        s.bind((sys.argv[1], int(sys.argv[2])))
        s.listen(0)
        print("[+]Start Server.")
    except Exception as e:
        print("[-]Error Happened: %s" % e.message)
        sys.exit(2)

    while True:
        c = s.accept()
        os.dup2(c[0].fileno(), 0)
        os.dup2(c[0].fileno(), 1)
        os.dup2(c[0].fileno(), 2)

        # It's important to use pty to spawn the shell.
        pty.spawn("/bin/sh")
        c[0].close()


if __name__ == "__main__":
    main()

【讨论】:

  • 太棒了,这对我来说很有意义!没有什么比代码更能说明问题了
猜你喜欢
  • 2011-08-02
  • 2014-04-29
  • 2011-06-20
  • 1970-01-01
  • 2012-11-18
  • 2012-01-30
  • 1970-01-01
  • 1970-01-01
  • 2013-11-02
相关资源
最近更新 更多