寻找可嵌入的PyQt4终端小部件

3 投票
2 回答
5296 浏览
提问于 2025-04-16 08:34

我写了一个应用程序,其中有一些“后台”进程用来处理一些事情。这些子进程很可能会失败或者出现意外行为,因为它们需要在比较复杂的环境中运行,所以我更希望能让操作员完全控制这些进程。

注意:我使用的是一个基于subprocess模块的类,而不是QProcess,这样可以对运行的进程有更多的控制功能。

目前,我使用一个QPlainTextEdit小部件来显示子进程的标准输出和错误信息,并且有一些按钮可以快速发送一些常用的信号(比如 INT、STOP、CONT、KILL 等),但是:

  • 在某些情况下,发送一些输入也是很有用的。虽然可以用文本输入框来实现,但我更希望使用一些更“专业”的东西。
  • 当然,没有直接的方法来解释特殊的控制字符,比如颜色代码、光标移动等。
  • 我还需要实现控制台的自动滚动管理,但这并不保证100%能正常工作(有时候滚动锁定的效果并不像预期那样好,等等)。

所以:有没有人知道有什么可以用来满足这些需求的工具?

我找到了qtermwidget,但它似乎更倾向于处理一个 shell 进程(而且 Python 的绑定似乎只允许运行/bin/bash)而不是与已经存在的进程进行输入输出的通信。

2 个回答

0

你可以试试QConsole(http://qconsole.sourceforge.net/)。我没用过这个软件,但看起来它正是你需要的那种东西。

4

这样做有帮助吗?

#!/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_())

撰写回答