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

Python 如何在PyQt5中制作终端控制台(终端仿真器)?,python,python-3.x,batch-file,pyqt5,terminal-emulator,Python,Python 3.x,Batch File,Pyqt5,Terminal Emulator,我正在用Python构建一个应用程序,用PyQt5构建一个图形用户界面。我需要在应用程序中插入某种“终端控制台”。用户可以通过单击按钮启动批处理文件,并且应该可以在文本字段中看到输出 此时,我使用以下方法。当用户按下按钮时,程序将启动批处理脚本(比如“myBat.bat”)。标准输出被提取并写入QTextEdit小部件 这很有效,但存在两个严重问题 (问题1)输出显示在批处理执行结束时。 有时候真的很痛苦。尤其是如果bat文件需要一些时间来执行,用户会得到一切都冻结的印象 (问题2)用户无法

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

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

这很有效,但存在两个严重问题


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

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

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

某些bat文件需要用户输入。我不知道怎么做

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

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

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

有个人把QTermWidget移植到PyQt4。这是链接: . 不幸的是,他的代码不是为Windows编译的(我在一台Windows10机器上工作)。他的端口是为PyQt4设计的。我的整个应用程序都是用PyQt5编写的。我不能回到PyQt4是有原因的

另一个人制作了这个软件: . 也很有趣,但不支持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:-)配合使用。
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
以抑制缓冲。

如何执行批处理文件?根据,您的
p
具有
.stdout
属性,可以在循环中读取。读取将阻塞,直到部分bat文件输出可用。这可能是进行您正在寻找的实时输出更新的方法。因此,我应该进行某种循环,不断从p.stdout读取,并将字符串添加到文本区域?对于输出问题,您可以使用概述的流程从Popen流式输出。请在Github上发布PyQt5终端库好吗?Hi Kirill,非常感谢你的建议。在执行
p.wait()
命令之前,我应该如何循环执行
p.stdout
?我是说,我怎么知道什么时候停止循环?非常感谢。@K.Mulier我已经添加了python2的示例。