如何在PyQt5中制作终端控制台(终端仿真器)?

时间:2016-07-20 14:27:45

标签: python python-3.x batch-file pyqt5 terminal-emulator

我正在使用PyQt5中的图形用户界面在Python中构建应用程序。我需要在应用程序中插入某种“终端控制台”。用户可以通过单击按钮启动批处理文件,并且应该看到输出显示在文本字段中。

此时,我使用以下方法。当用户按下按钮时,程序将启动批处理脚本(例如“myBat.bat”)。提取标准输出并将其写入QTextEdit小部件。

enter image description here

这很有效,但有两个严重的问题。

(问题1)输出显示在批处理执行结束时..

这有时真的很痛苦。特别是如果bat文件需要一些时间来执行,用户会得到一切都冻结的印象。

(问题2)用户无法发出命令..

某些bat文件需要用户输入。我不知道如何做到这一点。

(问题3)批处理文件完成后,结束了..

有时用户希望继续向终端发出命令,即使批处理文件已完成。例如,一个简单的dir命令,用于列出目录中的文件。一切皆有可能。

总结一切,我只需要在我的应用程序中创建一个功能终端控制台。

有一个人将QTermWidget移植到PyQt4。这是链接: https://sourceforge.net/projects/qtermwidget/?source=typ_redirect。不幸的是他的代码不是为Windows编译的(我正在使用Windows 10机器)。他的端口是为PyQt4制作的。我的整个应用程序都是用PyQt5编写的。我有理由不能回到PyQt4。

另一个人制作了这个软件: https://bitbucket.org/henning/pyqtermwidget/overview。同样非常有趣,但没有Windows支持。

请帮助..

编辑:

这是我目前正在运行的代码:

    ###############################################
    ### This function gets called when the user ###
    ### pushes the button                       ###
    ###############################################

    def myBatFunction(self):

        # 1. Call the proper batch file
        p = Popen("C:\\..\\myFolder\\myBat.bat" , cwd=r"C:\\..\\myFolder", stdout = subprocess.PIPE, stderr = subprocess.PIPE)
        stdout, stderr = p.communicate()
        p.wait()
        if p.returncode == 0:
            pass
        else:
            return

        # 2. Capture the standard out stream from the batch file
        msg = stdout.decode("utf-8")
        errMsg = stderr.decode("utf-8")

        self.myTextArea.setText(msg + errMsg)

    ###############################################

编辑:如果您认为这是一个重复的问题,请先验证其他问题是否为Windows 10用户提供解决方案,并与PyQt5配合使用: - )

1 个答案:

答案 0 :(得分:1)

在您的代码中p.wait()是与已打开进程同步的点。在该行之后,外部过程完成。因此,您需要在该行之前的循环中阅读p.stout。请检查以下示例:

#!/usr/bin/env python2
from subprocess import Popen, PIPE

p = Popen(["C:\\..\\myFolder\\myBat.bat"], stdout=PIPE, bufsize=1)
with p.stdout:
    for line in iter(p.stdout.readline, b''):
        print line,
p.wait() # wait for the subprocess to exit

请注意,bufsize应为1以禁止缓冲。